MCP 服务端开发

MCP(Model Context Protocol)是一种标准化协议,用于连接 AI 模型与外部工具和数据源。通过 MCP,你可以将现有的业务接口暴露给 AI,让 AI 能够理解并调用这些接口来完成用户的自然语言请求。

flowchart LR
    A[用户提问] --> B[PIG AI]
    B --> C[MCP SSE协议]
    C --> D[已有业务controller接口]

本教程将介绍:

  • 如何将现有的业务接口包装成 MCP 服务
  • 如何配置让 AI 能够调用你的接口
  • 如何通过自然语言让 AI 帮你查询业务数据

我们以行政区域查询为例,演示完整流程。

实际案例:让 AI 查询行政区域

现状分析

当前 PIGX 系统已经有一个行政区域管理模块,有对应的后台接口:

行政区域管理模块

目标效果

让用户可以直接对 AI 说:

  • "帮我查一下北京市有哪些区"
  • "广东省下面有多少个地级市?"
  • "查询一下上海市浦东新区的行政代码"

AI 就能自动调用我们的接口,返回准确的数据:

AI 查询示例

实现步骤

第一步:添加 MCP 依赖

pigx-upms-biz 项目的 pom.xml 文件中添加依赖:

<dependency>
  <groupId>com.pig4cloud</groupId>
  <artifactId>pigx-common-mcp</artifactId>
</dependency>

第二步:添加 @Tool 注解

找到需要暴露给 AI 的接口方法,添加 @Tool 注解:

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;

@RestController
@RequestMapping("/area")
public class SysAreaController {

    @GetMapping("/page")
    @Tool(description = "查询行政区划分页数据,支持按名称、编码、父级ID等条件筛选")
    public R getSysAreaPage(
            @ParameterObject Page page,
            @ToolParam(description = "查询条件:name-区域名称,code-区域编码,parentId-父级ID")
            @ParameterObject SysAreaEntity sysArea) {
        return R.ok(sysAreaService.page(page, Wrappers.query(sysArea)));
    }
}
描述的重要性

@Tool 注解的 description 属性非常重要,AI 会根据这个描述来判断何时调用该接口。描述应该清晰说明接口的功能和适用场景。

第三步:配置 MCP 服务

在 PIG AI 的 MCP 模块中,添加 MCP 服务配置:

配置项说明
协议类型选择 SSE(Server-Sent Events)模式
单体版地址http://ip:9999/admin/mcp/sse
微服务版地址http://ip:9999/{路由前缀}/mcp/sse
地址选择

微服务版本和单体版本的地址不同,请根据项目类型选择正确的地址。

配置端点暴露

在微服务对应的 Nacos 配置文件中增加以下配置:

security:
  oauth2:
    client:
      ignore-urls:
        - /actuator/**
        - /v2/api-docs
        - /mcp/*   # 暴露 MCP 相关端点

微服务版本额外配置

如果是微服务版本,还需要配置路由前缀:

spring:
  ai:
    mcp:
      server:
        base-url: /admin   # 对应网关路由前缀
MCP 配置界面

验证测试

配置完成后,可以通过以下方式验证:

  • "帮我查一下北京市有哪些区县"
  • "广东省下面有多少个地级市?"
  • "查询上海市浦东新区的行政代码"
  • "显示所有直辖市的行政区划"

AI 会自动理解需求,调用对应的接口,并以友好的方式展示结果。

扩展应用

掌握了这个方法,你可以将任何业务接口都包装成 MCP 服务:

应用场景示例
用户管理查询用户信息、重置密码
订单系统查询订单状态、统计数据
库存管理查询库存数量、预警信息
财务报表生成各种维度的财务分析
日志分析智能检索和分析系统日志

最佳实践

@Tool 注解使用建议

  • 描述要具体:说明接口的功能、参数含义、返回内容
  • 参数要标注:使用 @ToolParam 描述每个参数的作用
  • 避免歧义:不同接口的描述应有明显区分

安全注意事项

安全注意

暴露给 AI 的接口应该只包含查询类操作,避免暴露删除、修改等敏感操作,防止 AI 误操作导致数据丢失。