【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

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

参考资料:

相关推荐
winlife_2 小时前
从一句话到可玩原型:用 funplay-unity-mcp 让 AI 搭起完整游戏循环
人工智能·游戏·unity·ai编程·mcp·游戏原型
无风听海2 小时前
ASP.NET Core .NET 10 错误响应体系全景:从 BadRequest 到编译器基础设施
后端·asp.net·.net
文心快码BaiduComate2 小时前
从个人效能到组织资产:文心快码企业版Agent Hub上线,提升团队AI编程效能
前端·后端·程序员
雪隐3 小时前
个人电脑玩AI00-前言
人工智能·后端
我是一颗柠檬3 小时前
【Java后端技术亮点】动态路由权限(按钮级权限),细粒度控制到按钮级别
java·开发语言·后端·状态模式
前端Hardy3 小时前
CSS 动画真的比 JS 快?Josh Comeau 做了组实验,结果跟直觉不一样
前端·javascript·后端
Front思3 小时前
调取支付宝支付正式环境不可以唤起来,但是沙箱可以
后端
foggyprojects3 小时前
AI 生成 SQL 模板以后,为什么还需要固定 helper 规则
后端
明天一点3 小时前
Cloudflare 通知转发钉钉机器人
前端·后端
前端Hardy3 小时前
前端日历组件,要变天了?Schedule-X v4.6 彻底杀疯了
前端·javascript·后端