一、服务端开发
1、项目结构
在这里插入图片描述
2、按照maven依赖

<dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
            <version>1.1.0-M1</version>
        </dependency>

3、application.yml配置文件

server:
  port: 2258

spring:
  ai:
    mcp:
      server:
        name: my-mcp-server # 你的 MCP 服务器名称
        version: 1.0.0
        type: ASYNC
        sse-endpoint: /mcp/sse
        request-timeout: 180s
        enabled: true


mcp:
  api:
    keys: apikey1

4、新建服务类和实现类
新建IStudentService服务类

package com.example.mcp_server_api.service;

public interface IStudentService {

    //查询学生的基本信息
    String getStudentInfoByName(String name);

    //查询学生的分数信息
    String getStudentScoreByName(String name);
}

新建StudentServiceImpl实现类

package com.example.mcp_server_api.service.impl;

import com.example.mcp_server_api.service.IStudentService;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;

@Service
public class StudentServiceImpl implements IStudentService {

    @Override
    @Tool(name="getStudentInfoByName",description = "获取学生基本信息")
    public String getStudentInfoByName(@ToolParam(description = "学生姓名") String name) {
        return String.format("%s,26,180cm身高",name);
    }

    @Override
    @Tool(name="getStudentScoreByName",description = "获取学生的成绩")
    public String getStudentScoreByName(@ToolParam(description = "学生姓名") String name) {
        return String.format("%s,89分",name);
    }
}

5、新建McpServerConfig类MCP服务配置类

package com.example.mcp_server_api.config;

import com.example.mcp_server_api.service.IStudentService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class McpServerConfig {
    @Bean
    public ToolCallbackProvider studentToolCallbackProvider(IStudentService studentService) {
        // 打印传入的 studentService 实例
        //System.out.println("studentService 实例: " + studentService.getClass().getName());
        MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder()
                .toolObjects(studentService)
                .build();
        return provider;
    }
}

6、新建McpApiKeyInterceptor拦截器类,用于鉴权

package com.example.mcp_server_api.handlerInterceptorConfig;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.List;


@Component
public class McpApiKeyInterceptor implements HandlerInterceptor {
    @Value("${mcp.api.keys}") // 从配置文件注入合法的API Key列表
    private List<String> validApiKeys;

    //拦截器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String authHeader = request.getHeader("API_KEY");
        System.out.println("请求头");
        System.out.println(authHeader);
        if(authHeader != null && validApiKeys.contains(authHeader)){
            return true;
        }
        return false;
    }
}

7、新建WebConfig类,加入拦截器

package com.example.mcp_server_api.handlerInterceptorConfig;

import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Resource
    private McpApiKeyInterceptor mcpApiKeyInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 指定拦截MCP服务器的SSE端点路径
        registry.addInterceptor(mcpApiKeyInterceptor).addPathPatterns("/mcp/**");
    }
}

至此服务端配置完成
二、使用cursor测试MCP服务
1、找到mcp的设置,并增加一个mcp指向配置
在这里插入图片描述
在mcp.json中进行如下配置

{
  "mcpServers": {
    "my-mcp-server": {
      "url": "http://localhost:2258/mcp/sse",
      "headers": {
        "API_KEY": "apikey1"
      }
    }
  }
}

在这里插入图片描述
2、判断连状态
当圆点为绿色时,代表客户端已经成功连接服务器
在这里插入图片描述
注意 一定需要再里面手动选择tools,否则无法测试
在这里插入图片描述
在这里插入图片描述

3、进行对话测试,注意需要将对话下方选择为Agent模式
在这里插入图片描述

4、然后进行提问测试,注意需要以自然语言的形式进行测试
如:@my-mcp-server 查询学生张三的基本信息?,其中my-mcp-server为mcp.json中配置的mcp服务的名称,该名称对应后端配置文件中的spring.ai.mcp.server.name
5、问话后如下图,点击运行可看到结果

在这里插入图片描述
在这里插入图片描述
完整测试结果
在这里插入图片描述
6、如果在dify中 添加MCP服务,需要在地址栏配置上验证key,并且拦截器可以参考如下方式写

package com.example.mcp_server_api.handlerInterceptorConfig;

import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.List;
import java.util.Map;


@Component
public class McpApiKeyInterceptor implements HandlerInterceptor {
    @Value("${mcp.api.keys}") // 从配置文件注入合法的API Key列表
    private List<String> validApiKeys;

    //拦截器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String authHeader = request.getHeader("API_KEY");
        String sk=request.getParameter("sk");
        System.out.println("测试");
        System.out.println(authHeader);
        System.out.println(sk);
        if(StringUtils.isNotBlank(authHeader) && validApiKeys.contains(authHeader)){
            return true;
        }

        if(StringUtils.isNotBlank(sk) && validApiKeys.contains(sk)){
            return true;
        }
        if(request.getMethod().equals("POST") && "/mcp/message".equals(request.getRequestURI())){
            return true;
        }
        return false;
    }
}

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐