> ## Documentation Index
> Fetch the complete documentation index at: https://blog.pig4cloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Java 玩转 Gitee MCP：手把手教你打造 AI 仓库助手

> 通过 Gitee MCP 在 Java 生态中的集成应用，结合两种传输模式（stdio/SSE）实现 AI 助手对代码仓库的智能管理，上手 Java MCP 开发

## 引言

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

<img src="https://minio.pigx.vip/oss/202503/1742138820.jpeg" alt="1742138820" />

虽然 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 发布页](https://gitee.com/oschina/mcp-gitee/releases/tag/v0.1.3) 下载对应操作系统的 MCP Gitee Server。

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

```bash theme={null}
chmod +x mcp-gitee
```

### 构建 MCP Java 客户端

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

```xml theme={null}
<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 模型配置：

```yaml theme={null}
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）接收服务器的响应
* 适合在本地开发环境中使用，无需额外的网络配置

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

#### 实现代码

```java theme={null}
@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 服务器：

```bash theme={null}
mcp-gitee -transport sse -token GITEE-TOKEN
```

然后，在 Java 代码中使用 SSE 传输模式：

```java theme={null}
@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 仓库助手。
