【MCP入门篇】从0到1教你搭建MCP服务

MCP基础概念讲解

为什么需要MCP

对于不同厂商提供的大模型 对FunctionCalling的格式要求各不相同 在对接多个大模型时

开发者需要为每种模型编写适配逻辑 这种情况下维护成本非常高

因此需要有一种统一的规范 规范工具的描述 调用 响应等

使得工具服务只需要按照这种规范去实现 就可以被任意支持MCP的LLM客户端调用

什么是MCP

MCP就是一种标准化工具调用协议规范

他解决了以下问题:

  • 工具服务怎么暴露出能力
  • 调用端如何去声明自己有哪些工具
  • 模型如何发现可用工具
  • 模型如何发起工具调用
  • 调用结果如何返回并且继续推理

工具服务只需要按照这种规范去构建应用

LLM 客户端在和 大模型 进行交互的时候 将 MCP 工具描述转换为对应模型所需要的Function Tool参数

大模型 决定调用工具的时候 会返回一个工具调用的请求 MCP 去拦截该请求 将其转发给对应的MCP Server执行

再将结果回填给大模型 让大模型生成最终答案

SpringAI搭建MCP-Server

本文以Java语言 通过SpringAI为例 讲解Stdio SSE两种形式的MCP-Server的完整流程

实现一个加减乘除的Tool 适合想要入门学习MCP的小白

STDIO模式

创建基于进程内通信的传输

当你使用 STDIO 传输方式连接 MCP 服务时,客户端通常会创建一个子进程来运行你的 MCP 服务程序

引入依赖

本文以1.0.0-RC1版本为例 需要引入如下依赖:

spring-ai-starter-mcp-server提供了快速构建 MCP服务器的功能

xml 复制代码
<properties>
    <java.version>17</java.version>
    <spring-ai.version>1.0.0-RC1</spring-ai.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-mcp-server</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>

创建工具服务

SpringAI提供了Tool注解 通过Tool注解 可以将我们定义的方法定义为一种工具

通过description来描述这个工具的作用 这是给AI看的

java 复制代码
package cn.omenkk.service;

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;

/**
* @author omenkk7
* @description 数学工具类,提供基本的加减乘除运算
* @create 2025/12/20
*/
@Service
public class MathTool {

    /**
* 加法运算
* @param a 第一个数
* @param b 第二个数
* @return 两数之和
*/
@Tool(description = "执行加法运算,计算两个数的和")
    public double add(double a, double b) {
        return a + b;
    }

    /**
* 减法运算
* @param a 被减数
* @param b 减数
* @return 两数之差
*/
@Tool(description = "执行减法运算,计算两个数的差")
    public double subtract(double a, double b) {
        return a - b;
    }

    /**
* 乘法运算
* @param a 第一个数
* @param b 第二个数
* @return 两数之积
*/
@Tool(description = "执行乘法运算,计算两个数的积")
    public double multiply(double a, double b) {
        return a * b;
    }

    /**
* 除法运算
* @param a 被除数
* @param b 除数
* @return 两数之商
* @throws IllegalArgumentException 当除数为0时抛出异常
*/
@Tool(description = "执行除法运算,计算两个数的商")
    public double divide(double a, double b) {
        if (b == 0) {
            throw new IllegalArgumentException("除数不能为0");
        }
        return a / b;
    }

}

创建你的Spring Application

typescript 复制代码
@SpringBootApplication
public class McpDemo3Application {

    public static void main(String[] args) {
        SpringApplication.run(McpDemo3Application.class, args);
    }

    @Bean
    public ToolCallbackProvider mathTools(MathTool mathTool) {
        return MethodToolCallbackProvider.builder().toolObjects(mathTool).build();
    }
}

构建项目

执行mvn package 将项目打成jar包

在客户端使用

swift 复制代码
{
  "mcpServers": {
    "计算MCP": {
      "name": "计算MCP",
      "description": "",
      "type": "stdio",
      "command": "C:\Users\连庆辉\AppData\Local\Programs\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\java.exe",
      "args": [
       // 禁用 Spring Boot Web 应用上下文(STDIO 模式不需要启动HTTP服务器)
        "-Dspring.main.web-application-type=none",  
        // // 启用 MCP 服务器的 STDIO 传输模式
        "-Dspring.ai.mcp.server.stdio=true",
        "-jar",
        "G:\ai-agent\code\mcp-demo2\target\mcp-demo2-0.0.1-SNAPSHOT.jar"
      ],
      "environmentVariables": {
      },
      "timeout": 60
    }
  }
}

我是在Cherry studio上跑的 像类似的应用 如cursor Trae上均可以使用

读者可以检索资料 尝试做一个MCP Client 对接自己的MCP Server

SSE模式

SSE 是基于 HTTP 协议的一种"单向、服务器主动推送"的长连接通信机制 因此我们可以通过SpringMVC来构建

通过SSE模式跑的MCP服务 可以部署在服务器上 通过SSE连接向外提供功能

下面我采用的是1.1.2的版本spring-ai-bom 它能够帮你管理spring-ai相关依赖的版本

引入依赖

重点是引入spring-ai-starter-mcp-server-webmvc依赖:

  • 使用 Spring MVC 的基于 HTTP 的传输
  • 自动配置 SSE 传输所需的 Web 端点与 Controller或处理流式响应逻辑,无需额外编码。
  • 可选STDIO传输(通过设置启用spring.ai.mcp.server.stdio=true
  • 包含spring-boot-starter-web依赖项
xml 复制代码
<properties>
    <java.version>17</java.version>
    <spring-ai.version>1.1.2</spring-ai.version>
</properties>

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

<dependencies>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-mcp-server-webmvc</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>
</dependencies>
ini 复制代码
# spring.main.web-application-type=none

# NOTE: You must disable the banner and the console logging
# to allow the STDIO transport to work !!!
spring.main.banner-mode=off
# logging.pattern.console=

# spring.ai.mcp.server.stdio=false

spring.ai.mcp.server.name=my-weather-server
spring.ai.mcp.server.version=0.0.1

spring.ai.mcp.server.protocol=STREAMABLE
# spring.ai.mcp.server.protocol=STATELESS

logging.file.name=./model-context-protocol/weather/starter-webmvc-server/target/starter-webmvc-server.log

创建工具服务

与SSE模式类似 不再赘述

创建你的SpringApplication

typescript 复制代码
@SpringBootApplication
public class McpDemo3Application {

    public static void main(String[] args) {
        SpringApplication.run(McpDemo3Application.class, args);
    }

//显式手动注册你的工具服务
    @Bean
    public ToolCallbackProvider mathTools(MathTool mathTool) {
        return MethodToolCallbackProvider.builder().toolObjects(mathTool).build();
    }
}

在客户端使用

首先需要在本地或者服务器启动你的Web服务 接下来 暴露你的服务给客户端 让他知道怎么去调用你的服务

css 复制代码
{
  "mcpServers": {
    "数学运算服务1": {
      "name": "数学运算服务1",
      "description": "",
      "type": "streamableHttp",
      "url": "http://localhost:8080/mcp",
      "headers": {
        "Content-Type": "application/json",
        "Authorization": "Bearer token"
      },
      "timeout": 60,
      "advancedSettings": {}
    }
  }
}

示例

小结

本文讲解了关于MCP 以及简单讲解了怎么使用SpringAI去创建一个MCP Server

如果对你有帮助 请点个赞谢谢!!!

参考资料:

相关推荐
okseekw2 小时前
Java多线程开发实战:解锁线程安全与性能优化的关键技术
java·后端
HuangYongbiao2 小时前
NestJS 架构设计系列:应用服务与领域服务的区别
后端·架构
技术不打烊2 小时前
MySQL主从延迟飙升?元数据锁可能是“真凶”
后端
無量2 小时前
MySQL架构原理与执行流程
后端·mysql
JHC0000002 小时前
dy直播间评论保存插件
java·后端·python·spring cloud·信息可视化
武子康3 小时前
大数据-190 Filebeat→Kafka→Logstash→Elasticsearch 实战
大数据·后端·elasticsearch
西京刀客3 小时前
go语言-切片排序之sort.Slice 和 sort.SliceStable 的区别(数据库分页、内存分页场景注意点)
后端·golang·sort·数据库分页·内存分页
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue汽车销售系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·汽车·课程设计
聆风吟º3 小时前
【Spring Boot 报错已解决】Spring Boot项目启动报错 “Main method not found“ 的全面分析与解决方案
android·spring boot·后端