Создайте ИИ-агента, подключенного к WeCom, за 5 минут: практическое руководство по протоколу MCP

技术架构

Почему WeCom + MCP?

WeCom (Enterprise WeChat) охватывает более 80 % китайских предприятий и является фактическим стандартом для внутренней коммуникации. Подключение ИИ-агента к WeCom означает:

  • Нулевой порог входа: Сотрудники используют ИИ в привычном чат-интерфейсе
  • Встроенные права доступа: Повторное использование организационной структуры и контроля доступа WeCom
  • Доставка сообщений: ИИ может проактивно отправлять сообщения сотрудникам и группам
  • Интеграция согласований: ИИ может инициировать рабочие процессы согласования от имени сотрудников

WeCom + MCP = самый короткий путь к корпоративному ИИ-агенту


Обзор архитектуры

┌──────────────┐     MCP Protocol    ┌──────────────────┐     HTTP API     ┌──────────────┐
│  AI Agent    │ ◄──────────────────► │   MCP Server     │ ◄──────────────► │  WeCom API   │
│  (Claude)    │    JSON-RPC         │  (Our impl)      │    REST calls    │              │
└──────────────┘                     └──────────────────┘                   └──────────────┘

Инструменты MCP-сервера:
├── send_message        Отправить сообщение пользователю/группе
├── search_contacts     Поиск в адресной книге
├── get_department      Получить информацию об отделе
├── create_approval     Создать запрос на согласование
├── upload_file         Загрузить файл в WeCom
└── get_chat_history    Получить историю группового чата

Шаг 1: Создание приложения WeCom

1.1 Получение учётных данных WeCom

Войдите в WeCom Admin Console:

1. Управление приложениями → Создать приложение
2. Запишите учётные данные:
   - corpId: ww1234567890abcdef
   - agentId: 1000002
   - secret: xxxxxxxxxxxxxxxxxxxxxxxxxx
3. Укажите URL обратного вызова: https://your-domain.com/wecom/callback

Шаг 2: Реализация MCP-сервера

2.1 Структура проекта

wecom-mcp-server/
├── src/main/java/com/example/wecom/
│   ├── WecomMcpServerApplication.java
│   ├── config/WecomConfig.java
│   ├── mcp/
│   │   ├── WecomMcpServer.java
│   │   └── tools/
│   │       ├── SendMessageTool.java
│   │       ├── SearchContactsTool.java
│   │       ├── GetDepartmentTool.java
│   │       └── CreateApprovalTool.java
│   └── wecom/
│       ├── WecomApiClient.java
│       └── WecomTokenManager.java
└── pom.xml

2.2 Основные зависимости

<dependencies>
    <dependency>
        <groupId>io.modelcontextprotocol</groupId>
        <artifactId>mcp-spring-boot-starter</artifactId>
        <version>0.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.3.0</version>
    </dependency>
</dependencies>

2.3 Реализация MCP-сервера

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

@Configuration
@ConfigurationProperties(prefix = "wecom")
@Data
public class WecomConfig {
    private String corpId;
    private String agentId;
    private String secret;
    private String token;
    private String encodingAesKey;
}

2.4 Инструмент отправки сообщений

@Component
public class SendMessageTool implements McpTool {

    private final WecomApiClient wecomClient;

    @Override
    public String name() {
        return "send_message";
    }

    @Override
    public String description() {
        return "Send a message to a specified user or group via WeCom";
    }

    @Override
    public JsonNode inputSchema() {
        return objectMapper.readTree("""
            {
              "type": "object",
              "properties": {
                "receiverType": {
                  "type": "string",
                  "enum": ["user", "group"],
                  "description": "Receiver type: user or group"
                },
                "receiverId": {
                  "type": "string",
                  "description": "Receiver ID"
                },
                "messageType": {
                  "type": "string",
                  "enum": ["text", "markdown", "file"],
                  "description": "Message type"
                },
                "content": {
                  "type": "string",
                  "description": "Message content"
                }
              },
              "required": ["receiverType", "receiverId", "messageType", "content"]
            }
            """);
    }

    @Override
    public McpToolResult execute(Map<String, Object> args) {
        String receiverType = (String) args.get("receiverType");
        String receiverId = (String) args.get("receiverId");
        String messageType = (String) args.get("messageType");
        String content = (String) args.get("content");

        try {
            String msgId = wecomClient.sendMessage(
                receiverType, receiverId, messageType, content
            );
            return McpToolResult.success(
                Map.of("msgId", msgId, "status", "sent")
            );
        } catch (WecomApiException e) {
            return McpToolResult.error("Send failed: " + e.getMessage());
        }
    }
}

2.5 Менеджер токенов (авто-обновление)

@Component
public class WecomTokenManager {

    private final WecomConfig config;
    private final RestTemplate restTemplate;
    private String accessToken;
    private long expiresAt;

    public synchronized String getAccessToken() {
        if (accessToken != null && System.currentTimeMillis() < expiresAt) {
            return accessToken;
        }
        refreshAccessToken();
        return accessToken;
    }

    private void refreshAccessToken() {
        String url = String.format(
            "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",
            config.getCorpId(), config.getSecret()
        );

        JsonNode json = restTemplate.getForObject(url, JsonNode.class);
        this.accessToken = json.path("access_token").asText();
        int expiresIn = json.path("expires_in").asInt();
        this.expiresAt = System.currentTimeMillis() + (expiresIn - 300) * 1000L;
    }
}

Шаг 3: Конфигурация

application.yml

server:
  port: 8081

wecom:
  corpId: ${WECOM_CORP_ID}
  agentId: ${WECOM_AGENT_ID}
  secret: ${WECOM_SECRET}
  token: ${WECOM_CALLBACK_TOKEN}
  encodingAesKey: ${WECOM_ENCODING_AES_KEY}

mcp:
  server:
    name: wecom-mcp-server
    version: 1.0.0
    transport: sse
    sseEndpoint: /mcp/sse

Шаг 4: Настройка в Claude Desktop

Отредактируйте claude_desktop_config.json:

{
  "mcpServers": {
    "wecom": {
      "url": "http://localhost:8081/mcp/sse",
      "transport": "sse"
    }
  }
}

Теперь вы можете использовать функции WeCom напрямую в Claude:

Пользователь: Отправь сообщение в группу продукта о завтрашнем обзорном совещании в 15:00

Claude: Я отправлю это сообщение для вас.
[Вызов инструмента send_message]
→ receiverType: "group"
→ receiverId: "product_group_id"
→ messageType: "text"
→ content: "Уведомление: Обзорное совещание завтра в 15:00. Просьба присутствовать."

Сообщение успешно отправлено! msgId: msg_20260611_001

Развёртывание в продакшене

Docker

FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY target/wecom-mcp-server.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "app.jar"]
version: '3.8'
services:
  wecom-mcp:
    build: .
    ports:
      - "8081:8081"
    environment:
      - WECOM_CORP_ID=${WECOM_CORP_ID}
      - WECOM_AGENT_ID=${WECOM_AGENT_ID}
      - WECOM_SECRET=${WECOM_SECRET}
    restart: unless-stopped

Примечания по безопасности

  1. Никогда не хардкодьте секреты: Используйте переменные окружения или Vault
  2. Белый список IP: Настройте белый список IP для вызовов API в админке WeCom
  3. Аудит сообщений: Логируйте все отправленные сообщения для соответствия требованиям
  4. Ограничение частоты: У API WeCom есть лимиты частоты — реализуйте регулирование

Итог

Настройка за «5 минут» возможна, потому что MCP стандартизирует интеграцию — реализуйте MCP-сервер один раз, и все совместимые с MCP ИИ-инструменты смогут его использовать:

  1. Реализовано один раз, используется везде: Claude, Cursor, пользовательские агенты — все подключаются
  2. Экосистема Spring Boot: SDK WeCom, аутентификация, аудит из коробки
  3. Готово к продакшену: Авто-обновление токена, ограничение частоты, логи аудита, развёртывание Docker

Это самый короткий путь от «ИИ, который болтает» к «ИИ, который работает» — MCP делает это простым.

Попробуйте эти локальные браузерные инструменты — регистрация не требуется →

#MCP#企业微信#AI Agent#WeCom#工具调用#企业级