Skip to content

MCP 协议集成

Model Context Protocol(MCP)是 AI 工具生态的标准化协议,Spring AI Alibaba 提供了完整的 MCP 客户端与服务端实现,并通过 Nacos 支持分布式 MCP 注册中心。

什么是 MCP?

MCP(Model Context Protocol)是 Anthropic 提出的开放标准,定义了 AI 模型与外部工具/数据源之间的通信协议:

传统 Tool Calling:
  LLM ←→ 应用代码(紧耦合,工具与应用绑定)

MCP 方式:
  LLM ←→ MCP Client ←→ MCP Server(松耦合,工具独立部署)
                              ├── 文件系统 MCP Server
                              ├── 数据库 MCP Server
                              ├── GitHub MCP Server
                              └── 自定义业务 MCP Server

MCP 的核心价值

特性描述
标准化统一的工具描述和调用协议
可复用MCP Server 可被多个 AI 应用共享
解耦工具独立部署,不依赖特定 AI 框架
生态丰富的开源 MCP Server 生态

MCP 架构

┌─────────────────────────────────────────────────────┐
│                  AI 应用(Spring Boot)               │
│                                                      │
│  ChatClient                                          │
│      │                                               │
│      ▼                                               │
│  MCP Client(Spring AI)                             │
│      │                                               │
│      ├── STDIO Transport ──→ 本地 MCP Server 进程    │
│      │                                               │
│      └── SSE Transport ───→ 远程 MCP Server(HTTP)  │
└─────────────────────────────────────────────────────┘

MCP Server 提供:
  - Tools(工具列表)
  - Resources(资源访问)
  - Prompts(提示词模板)

MCP Client 配置

连接本地 MCP Server(STDIO)

xml
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mcp-client-spring-boot-autoconfigure</artifactId>
</dependency>
yaml
spring:
  ai:
    mcp:
      client:
        stdio:
          servers-configuration: classpath:mcp-servers.json
json
// mcp-servers.json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"],
      "env": {}
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
      }
    },
    "database": {
      "command": "java",
      "args": ["-jar", "my-db-mcp-server.jar"],
      "env": {
        "DB_URL": "jdbc:mysql://localhost:3306/mydb"
      }
    }
  }
}

连接远程 MCP Server(SSE)

yaml
spring:
  ai:
    mcp:
      client:
        sse:
          connections:
            my-remote-server:
              url: http://mcp-server.internal:8080/sse
              headers:
                Authorization: "Bearer ${MCP_TOKEN}"

在 ChatClient 中使用 MCP 工具

java
@Configuration
public class McpConfig {

    @Autowired
    private List<McpSyncClient> mcpClients; // 自动注入所有 MCP 客户端

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        // 将所有 MCP 工具注册到 ChatClient
        return builder
            .defaultTools(
                new SyncMcpToolCallbackProvider(mcpClients)
            )
            .build();
    }
}

// 使用时和普通 Tool Calling 完全一样
@GetMapping("/ask")
public String ask(@RequestParam String question) {
    return chatClient.prompt()
        .user(question)
        .call()
        .content();
    // LLM 会自动选择合适的 MCP 工具调用
}

开发 MCP Server

Spring AI Alibaba 支持将 Spring Boot 应用快速转换为 MCP Server:

xml
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mcp-server-spring-boot-autoconfigure</artifactId>
</dependency>

定义 MCP 工具

java
@Service
public class OrderMcpService {

    @Autowired
    private OrderRepository orderRepo;

    @Tool(description = "根据订单号查询订单详情")
    public OrderDetail getOrderDetail(
        @ToolParam(description = "订单号,格式:ORD-XXXXXXXX") String orderId
    ) {
        return orderRepo.findById(orderId)
            .map(OrderDetail::from)
            .orElseThrow(() -> new RuntimeException("订单不存在:" + orderId));
    }

    @Tool(description = "查询用户的订单列表,支持按状态筛选")
    public List<OrderSummary> listOrders(
        @ToolParam(description = "用户 ID") String userId,
        @ToolParam(description = "订单状态:ALL/PENDING/PAID/SHIPPED/COMPLETED,默认 ALL")
        String status
    ) {
        return orderRepo.findByUserIdAndStatus(userId,
            "ALL".equals(status) ? null : status);
    }

    @Tool(description = "申请退款,需要提供退款原因")
    public RefundResult applyRefund(
        @ToolParam(description = "订单号") String orderId,
        @ToolParam(description = "退款原因") String reason
    ) {
        return refundService.apply(orderId, reason);
    }
}

注册为 MCP Server

java
@SpringBootApplication
public class OrderMcpServerApplication {

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

    @Bean
    public ToolCallbackProvider mcpTools(OrderMcpService orderService) {
        return MethodToolCallbackProvider.builder()
            .toolObjects(orderService)
            .build();
    }
}
yaml
# application.yml
spring:
  ai:
    mcp:
      server:
        name: order-mcp-server
        version: 1.0.0
        type: SYNC  # SYNC 或 ASYNC
        sse-message-endpoint: /mcp/message  # SSE 模式端点

MCP Gateway:零代码转换

Spring AI Alibaba 提供了 MCP Gateway,可以将存量 REST API 零代码转换为 MCP 工具:

yaml
# mcp-gateway.yml
spring:
  ai:
    alibaba:
      mcp:
        gateway:
          enabled: true
          services:
            - name: user-service
              url: http://user-service:8080
              openapi-spec: http://user-service:8080/v3/api-docs
              # 自动从 OpenAPI 规范生成 MCP 工具描述

            - name: inventory-service
              url: http://inventory-service:8080
              tools:
                - path: /api/products/search
                  method: GET
                  name: searchProducts
                  description: "搜索商品,支持关键词和分类筛选"
                  parameters:
                    - name: keyword
                      in: query
                      description: "搜索关键词"
                    - name: category
                      in: query
                      description: "商品分类"

Nacos 分布式 MCP 注册中心

Spring AI Alibaba 与 Nacos 深度集成,实现 MCP Server 的服务发现和动态配置:

xml
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-nacos-mcp</artifactId>
</dependency>
yaml
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  ai:
    alibaba:
      mcp:
        nacos:
          enabled: true
          server-group: MCP_SERVERS
          # 自动发现注册在 Nacos 中的 MCP Server

MCP Server 注册到 Nacos

java
@SpringBootApplication
@EnableNacosMcpServer  // 启用 Nacos MCP 注册
public class OrderMcpServerApplication {
    // MCP Server 启动时自动注册到 Nacos
    // 包含:服务地址、工具列表、版本信息
}

MCP Client 动态发现

java
@Service
public class DynamicMcpService {

    @Autowired
    private NacosMcpClientRegistry mcpRegistry;

    public String callWithDynamicTools(String question) {
        // 从 Nacos 动态获取可用的 MCP Server 列表
        List<McpSyncClient> availableClients = mcpRegistry.getAvailableClients();

        return chatClient.prompt()
            .user(question)
            .tools(new SyncMcpToolCallbackProvider(availableClients))
            .call()
            .content();
        // 新部署的 MCP Server 无需重启即可被发现和使用
    }
}

常用开源 MCP Server

MCP Server功能安装
@modelcontextprotocol/server-filesystem文件系统读写npx -y @modelcontextprotocol/server-filesystem
@modelcontextprotocol/server-githubGitHub 操作npx -y @modelcontextprotocol/server-github
@modelcontextprotocol/server-postgresPostgreSQL 查询npx -y @modelcontextprotocol/server-postgres
@modelcontextprotocol/server-brave-searchBrave 搜索npx -y @modelcontextprotocol/server-brave-search
@modelcontextprotocol/server-puppeteer浏览器自动化npx -y @modelcontextprotocol/server-puppeteer

实战:多 MCP Server 协作

java
@Service
public class ResearchAssistant {

    @Autowired
    private ChatClient chatClient;

    /**
     * 研究助手:结合搜索、文件系统、GitHub 多个 MCP Server
     */
    public String research(String topic) {
        return chatClient.prompt()
            .system("""
                你是一个研究助手,可以使用以下工具:
                - brave_search:搜索最新信息
                - read_file / write_file:读写本地文件
                - github_search:搜索 GitHub 代码和项目
                
                请系统地研究给定主题,将结果保存到文件。
                """)
            .user("深入研究:" + topic + ",并将研究报告保存到 research-" + topic + ".md")
            .call()
            .content();
        // LLM 会自动编排多个 MCP 工具完成复杂任务
    }
}

MCP vs Tool Calling 对比

维度Tool CallingMCP
部署方式工具与应用同进程工具独立进程/服务
复用性仅限当前应用多应用共享
语言限制同语言(Java)跨语言(任意语言实现 Server)
动态发现静态注册支持动态发现(Nacos)
适用场景简单工具、业务逻辑复杂工具、跨团队共享

选择建议

  • 简单的业务工具 → 用 @Tool 注解(Tool Calling)
  • 需要跨应用共享的工具 → 用 MCP Server
  • 存量 REST API 快速接入 → 用 MCP Gateway
  • 微服务架构 → 用 Nacos MCP 注册中心

相关组件

本站内容由 褚成志 整理编写,仅供学习参考