引言

随着人工智能技术的快速发展,开发者工具也在不断进化。Gitee 作为国内领先的代码托管平台,现已推出 MCP (Model Control Protocol) 功能,让开发者能够通过 AI 助手更高效地管理代码仓库。mcp-gitee 是 Gitee 的模型上下文协议 (MCP) 服务器实现,它提供了一组与 Gitee API 交互的工具,允许 AI 助手管理仓库、Issue、Pull Request 等。

虽然 Gitee 官方目前仅提供 Go 语言实现,但这并不妨碍 Java 开发者大展身手!本文将以 LangChain4j 为技术基座,为老 Javaer 们呈现一套 MCP 集成方案。通过深度结合 Java 生态优势,我们将从零构建企业级 AI 仓库助手,揭秘如何用 Java 玩转 MCP 协议,让 Spring Boot 应用轻松获得 Gitee 智能管理能力。

MCP 是什么?

MCP (Model Control Protocol) 是一种允许 AI 模型与外部工具和服务进行交互的协议。通过 MCP,AI 助手可以执行各种操作,如创建仓库、提交代码、管理 Issue 和 Pull Request 等,使开发流程更加智能化和自动化。

MCP 的核心优势在于:

  • 为 AI 模型提供了与外部系统交互的标准接口
  • 支持多种传输模式,适应不同的使用场景
  • 使 AI 能够执行实际操作,而不仅仅是提供建议

准备工作

下载 Gitee MCP

首先,从 Gitee MCP 发布页 下载对应操作系统的 MCP Gitee Server。

笔者使用 Mac,下载解压后需要分配执行权限:

chmod +x mcp-gitee

构建 MCP Java 客户端

在 Maven 项目中添加以下依赖:

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-mcp</artifactId>
    <version>1.0.0-beta2</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>1.0.0-beta2</version>
</dependency>

配置文件

application.yml 中添加 AI 模型配置:

langchain4j:
  open-ai:
    chat-model:
      api-key: sk-
      base-url: https://api.deepseek.com/v1
      model-name: deepseek-chat
      log-requests: true

MCP 传输模式

MCP 支持多种传输模式,主要有 stdio 和 SSE 两种模式,下面我们分别介绍。

方式一:MCP stdio 模式

stdio 模式概念

stdio(标准输入输出)模式是 MCP 的一种基本传输方式,它通过标准输入输出流与 MCP 服务器进行通信。在这种模式下:

  • MCP 客户端通过子进程启动 MCP 服务器
  • 通过标准输入(stdin)向服务器发送请求
  • 通过标准输出(stdout)接收服务器的响应
  • 适合在本地开发环境中使用,无需额外的网络配置

这种模式的优点是设置简单,无需额外的网络配置;缺点是只能在本地使用,不适合分布式环境。

实现代码

@Autowired
private ChatLanguageModel chatLanguageModel;

@SneakyThrows
@Test
void contextLoads() {
    // 创建 stdio 传输模式
    McpTransport transport = new StdioMcpTransport.Builder()
            .command(List.of("/Users/lengleng/Downloads/mcp-gitee-darwin-arm64/mcp-gitee", "-token", "GITEE-TOKEN"))
            .logEvents(true) // 可选:在日志中显示通信内容
            .build();

    // 创建 MCP 客户端
    @Cleanup McpClient mcpClient = new DefaultMcpClient.Builder()
            .transport(transport)
            .build();

    // 创建工具提供者
    ToolProvider toolProvider = McpToolProvider.builder()
            .mcpClients(List.of(mcpClient))
            .build();

    // 构建 Gitee AI 服务
    GiteeAiService giteeAiService = AiServices.builder(GiteeAiService.class)
            .chatLanguageModel(chatLanguageModel)
            .toolProvider(toolProvider)
            .build();

    // 使用 AI 服务查询 Gitee 信息
    String result = giteeAiService.chat("获取 log4j/pig 开启的 issue 列表");

    log.info("gitee mcp result: {}", result);
}

方式二:MCP Server SSE 模式

SSE 模式概念

SSE(Server-Sent Events)模式是一种基于 HTTP 的单向通信机制,允许服务器向客户端推送数据。在 MCP 中使用 SSE 模式:

  • MCP 服务器以独立进程运行,监听 HTTP 请求
  • 客户端通过 HTTP 连接到服务器
  • 服务器可以持续向客户端推送事件和数据
  • 适合在分布式环境中使用,支持多客户端连接

SSE 模式的优点是支持分布式部署,可以被多个客户端同时访问;缺点是配置相对复杂,需要额外的网络设置。

实现步骤

首先,以 SSE 模式启动 Gitee MCP 服务器:

mcp-gitee -transport sse -token GITEE-TOKEN

然后,在 Java 代码中使用 SSE 传输模式:

@Autowired
private ChatLanguageModel chatLanguageModel;

@SneakyThrows
@Test
void contextLoads() {
    // 创建 SSE 传输模式
    McpTransport sseTransport = new HttpMcpTransport.Builder()
            .sseUrl("http://localhost:8000/sse")
            .logRequests(true) // 可选:记录请求日志
            .logResponses(true) // 可选:记录响应日志
            .build();

    // 创建 MCP 客户端
    @Cleanup McpClient mcpClient = new DefaultMcpClient.Builder()
            .transport(sseTransport)
            .build();

    // 创建工具提供者
    ToolProvider toolProvider = McpToolProvider.builder()
            .mcpClients(List.of(mcpClient))
            .build();

    // 构建 Gitee AI 服务
    GiteeAiService giteeAiService = AiServices.builder(GiteeAiService.class)
            .chatLanguageModel(chatLanguageModel)
            .toolProvider(toolProvider)
            .build();

    // 使用 AI 服务查询 Gitee 信息
    String result = giteeAiService.chat("获取 log4j/pig 开启的 issue 列表");

    log.info("gitee mcp result: {}", result);
}

输出结果示例

无论使用哪种传输模式,成功执行后都会得到类似的结果:

2025-03-16T23:19:51.211+08:00  INFO 67659 --- [           main] com.example.demo.DemoApplicationTests    : gitee mcp result: 目前 log4j/pig 仓库中有以下开启的 issue:

1. **JDK17版本中oauth2.0的授权码模式,无法通过code获取到access_token**
   - 编号: IBQJ94
   - 创建时间: 2025-03-04T13:04:53+08:00
   - 链接: [https://gitee.com/log4j/pig/issues/IBQJ94](https://gitee.com/log4j/pig/issues/IBQJ94)

两种模式的对比

特性stdio 模式SSE 模式
部署方式本地子进程独立服务器
适用场景本地开发分布式环境
配置复杂度简单相对复杂
多客户端支持不支持支持
网络要求需要网络连接

总结

通过 Java 与 MCP 的结合,我们可以创建一个功能强大的 Gitee 仓库助手,实现代码管理的智能化和自动化。这不仅提高了开发效率,还减少了重复性工作,让开发者能够专注于更有创造性的任务。

MCP 提供的 stdio 和 SSE 两种传输模式满足了不同场景的需求:

  • stdio 模式适合本地开发和测试
  • SSE 模式适合分布式环境和多客户端访问

随着 AI 技术的不断发展,MCP 协议的功能也将越来越丰富,为开发者提供更多可能性。希望本文能够帮助您了解如何使用 Java 玩转 MCP,打造属于自己的 AI Gitee 仓库助手。