Создайте ИИ-агента, подключенного к 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
Примечания по безопасности
- Никогда не хардкодьте секреты: Используйте переменные окружения или Vault
- Белый список IP: Настройте белый список IP для вызовов API в админке WeCom
- Аудит сообщений: Логируйте все отправленные сообщения для соответствия требованиям
- Ограничение частоты: У API WeCom есть лимиты частоты — реализуйте регулирование
Итог
Настройка за «5 минут» возможна, потому что MCP стандартизирует интеграцию — реализуйте MCP-сервер один раз, и все совместимые с MCP ИИ-инструменты смогут его использовать:
- Реализовано один раз, используется везде: Claude, Cursor, пользовательские агенты — все подключаются
- Экосистема Spring Boot: SDK WeCom, аутентификация, аудит из коробки
- Готово к продакшену: Авто-обновление токена, ограничение частоты, логи аудита, развёртывание Docker
Это самый короткий путь от «ИИ, который болтает» к «ИИ, который работает» — MCP делает это простым.
Попробуйте эти локальные браузерные инструменты — регистрация не требуется →
#MCP#企业微信#AI Agent#WeCom#工具调用#企业级