[Discord MCP] Gateway 아키텍처 설계

Claude Code 팀에서 Discord를 통한 사용자 소통을 위해 Discord Gateway Service를 설계했다. 이 글에서는 주요 아키텍처 결정 사항과 user_comm Agent 설계를 정리한다.


1. 전체 아키텍처

구성 요소

계층구성요소역할
DiscordBot, Channel, Thread사용자 인터페이스
GatewayWebSocket, REST API, SSE메시지 라우팅
MCPgcp-mcp, oci-mcp, db-mcp도구 실행
user_commDiscord Agent사용자 소통 담당

메시지 흐름


2. user_comm Agent (사용자 소통 담당)

역할 및 책임

user_comm Agent는 Claude Code 팀의 멤버로서 Discord 채널을 통해 사용자와 소통하고 다른 agent들과 협업합니다.

기능설명
입력 수신Discord 메시지를 받아 적절한 agent에게 전달
의견 요청다른 agent의 요청으로 사용자 의견 질의
알림/보고시스템 상태, 경고, 리포트 전송
팀 통신다른 agent와 메시지 송수신

내부 구조

메시지 타입

class MessageType(Enum):
    TASK_REQUEST = "task_request"      # 작업 요청
    NOTIFICATION = "notification"       # 알림
    OPINION_REQUEST = "opinion_request" # 의견 요청
    OPINION_RESPONSE = "opinion_response" # 의견 응답
    STATUS_REPORT = "status_report"     # 상태 보고
    ERROR = "error"                     # 에러

주요 기능 동작

입력 수신 (Discord → Agent)

사용자: "@gcp-monitor 서버 상태 확인"
  → DiscordBot.on_message
  → UserCommAgent._parse_command (target: gcp-monitor)
  → TeamCommunicator.send_to_agent
  → Discord: "gcp-monitor에게 요청을 전달했습니다."

의견 요청 (Agent → Discord)

gcp-monitor: "디스크 정리할까요?" → user_comm
  → DiscordBot.ask_opinion (버튼 또는 답장 대기)
  → 사용자 응답
  → TeamCommunicator.send_to_agent (응답 전달)

알림/보고 (Agent → Discord)

oci-monitor: "디스크 92% 경고" → user_comm
  → DiscordBot.send_message (Embed 형식)

3. Redis 없이 동작하는 가벼운 아키텍처

왜 Redis를 제거했나?

항목Redis 사용In-Memory 사용
Thread LockRedis SET NXPython dict
이벤트 분배Redis StreamsSSE 직접
상태 저장Redis Cache메모리 캐시

결론: 단일 인스턴스 환경에서는 In-Memory로 충분

Gateway 구조

구성요소 상세

모듈역할특징
Discord BotWebSocket 연결자동 재연결
Thread Lock동시성 제어5분 타임아웃
Message Cache메시지 보관최대 1000개
SSE Manager실시간 전송모든 MCP에 브로드캐스트

4. MCP 선택 방식: 4단계 하이브리드

선택 우선순위

순위방식예시설명
1슬래시 커맨드/gcp status가장 명시적
2@멘션@gcp-monitor status자연스러운 대화
3키워드 감지gcp 서버 상태키워드 자동 인식
4채널별 지정#gcp-모니터링채널 기본 MCP

Fallback 동작 순서

슬래시 커맨드 목록

커맨드MCP설명
/gcp status [server]gcp-mcpGCP 서버 상태
/gcp listgcp-mcpGCP 인스턴스 목록
/oci status [server]oci-mcpOCI 서버 상태
/oci listoci-mcpOCI 인스턴스 목록
/db query <sql>db-mcpDB 쿼리 실행
/db listdb-mcpDB 목록
/alert checkalert-mcp알림 확인

5. Thread Lock 규칙

락 동작 방식

Lock API

MethodEndpoint설명
POST/api/threads/{id}/acquire락 획득
POST/api/threads/{id}/release락 해제
GET/api/threads/{id}/lock락 상태 확인

요청/응답 예시

락 획득 요청

POST /api/threads/123456/acquire
{
  "agent_name": "gcp-mcp",
  "timeout": 300
}

락 획득 응답

{
  "acquired": true,
  "thread_id": "123456",
  "agent": "gcp-mcp"
}

6. MCP 도구 (8개)

도구 목록

도구설명주요 파라미터
discord_send_message메시지 전송channel_id, content
discord_get_messages메시지 조회channel_id, limit
discord_wait_for_message메시지 대기channel_id, timeout
discord_create_thread스레드 생성channel_id, message_id
discord_list_threads스레드 목록channel_id
discord_archive_thread스레드 아카이브thread_id
discord_acquire_thread락 획득thread_id, agent_name
discord_release_thread락 해제thread_id, agent_name

도구 관계도

사용 예시

# 메시지 전송
discord_send_message(
    channel_id="123456789",
    content="서버 상태: 정상"
)

# 스레드 생성
discord_create_thread(
    channel_id="123456789",
    message_id="987654321",
    name="상태 확인"
)

# 락 획득
discord_acquire_thread(
    thread_id="111222333",
    agent_name="gcp-mcp",
    timeout=300
)

7. 파일 구조

디렉토리 설명

경로설명
gateway/Gateway Service (FastAPI)
user_comm/사용자 소통 Agent
discord_mcp/MCP Server (8개 도구)
mcp_shared/공유 MCP 도구
docs/문서

8. 실행 방법

로컬 실행

# Gateway Service 시작
uvicorn gateway.main:app --host 0.0.0.0 --port 8081

# user_comm Agent 시작 (독립 모드)
python main.py --standalone

# user_comm Agent 시작 (팀 모드)
python main.py --team server-monitor

# 헬스체크
curl http://localhost:8081/health

# 응답
{"status": "healthy", "discord_connected": true}

Claude Code MCP 설정

// ~/.claude/settings.json
{
  "mcpServers": {
    "discord-gateway": {
      "command": "python3",
      "args": ["/path/to/discord_mcp/server.py"],
      "env": {
        "GATEWAY_URL": "http://localhost:8081"
      }
    }
  }
}

9. 로드맵

Phase 1: 완료

  • FastAPI Gateway Service
  • Discord WebSocket 연결
  • Thread Lock (In-Memory)
  • SSE 브로드캐스트
  • MCP Server (8개 도구)

Phase 2: 진행 예정

  • user_comm Agent 구현
  • 슬래시 커맨드 구현
  • 채널별 기본 MCP 설정
  • 키워드 자동 감지
  • 라우팅 설정 파일

Phase 3: 선택 사항

  • API 인증 (API Key)
  • Rate Limiting
  • 메시지 영속성 (SQLite)

결론

가벼운 아키텍처로 시작해서 필요시 확장하는 전략을 선택했다.

항목현재향후
상태 저장In-MemorySQLite (필요시)
분산 락미사용Redis (다중 인스턴스 시)
인증없음API Key (필요시)
사용자 소통Gateway 직접user_comm Agent

단일 인스턴스에서는 현재 구조로 충분하며, 트래픽이 늘어나면 점진적으로 확장할 계획이다. user_comm Agent를 통해 사용자와의 소통을 체계화하고, 팀 내 다른 agent들과의 협업을 효율화한다.


영어 버전: English Version

Hugo로 만듦
JimmyStack 테마 사용 중