LLM 에이전트가 협업툴과 MySQL 데이터베이스를 직접 다루게 하는 자체 제작 TypeScript MCP 서버 2종. 62개 도구의 협업툴 서버는 Redis 캐싱으로 "프로젝트 이름으로 업무 생성" 같은 자연어 워크플로를 지원하고, MySQL 서버는 환경별 연결과 운영 DB 안전장치를 갖춤.
67개 도구, 캐싱 전략, 운영 DB 안전장치까지 — LLM 에이전트에게 실무 도구를 쥐여주는 인프라 설계
업무·댓글·태그·일정·드라이브·위키·메일·알림·전자결재까지 협업툴 전 영역을 자연어로 조회·생성·수정. IDE 안에서 "이번 주 일정 보여줘"가 동작.
내 정보 24시간·프로젝트 정보 1시간 캐싱. "OO 프로젝트에 업무 생성해줘"처럼 ID 대신 이름으로 명령해도 캐시에서 매핑을 해석해 API 호출을 최소화.
prod / dev / local 프로필별 연결 정보를 분리하고, 실제 사용 시점에만 커넥션을 여는 lazy 연결 + 커넥션 풀 관리.
운영 환경은 SELECT·CTE만 허용하고 INSERT/UPDATE/DELETE/DDL 차단. 멀티 스테이트먼트 금지, 쿼리 길이 제한, 명시적 connect_prod/disconnect_prod로 연결 수명까지 통제.
테이블·컬럼 메타데이터를 로컬 파일 캐시(TTL 1시간)로 저장. LLM이 스키마를 물을 때마다 DB를 두드리지 않아 응답 속도와 DB 부하를 동시에 개선.
접속 프로그램명(program_name) 기반 승인 방식의 DB 접근제어 환경을 위해 연결 속성 오버라이드 지원. GUI 툴처럼 승인된 프로그램명으로 접속 가능.
Cursor·Claude 같은 MCP 클라이언트와 표준입출력 JSON-RPC로 통신. 에이전트별 커스텀 연동 대신 표준 프로토콜 하나로 어느 클라이언트에서도 동작.
client ⇄ stdio JSON-RPC ⇄ server경량 목록 조회(list_tables)와 상세 조회(describe_table)를 분리. LLM 컨텍스트에 필요한 만큼만 싣도록 도구 단위를 절단.
list (cheap) vs describe (rich)협업툴 서버는 Redis에 엔티티 캐시(24h/1h TTL), MySQL 서버는 로컬 파일에 스키마 캐시(1h TTL). 데이터 성격에 맞춰 캐시 저장소를 다르게 선택.
Redis entity cache · file schema cache실행 전 SQL을 정적 검사해 운영 환경의 쓰기 쿼리·멀티 스테이트먼트·초과 길이 쿼리를 차단. LLM이 생성한 쿼리를 신뢰하지 않는 방어적 설계.
validate(sql) → allow | reject에이전트마다 플러그인 방식이 다르면 연동을 N번 만들어야 함. Model Context Protocol 표준 서버로 만들어 Cursor·Claude 등 어떤 MCP 클라이언트에서도 같은 도구가 동작하도록 설계.
LLM이 "프로젝트 이름"으로 말하면 매번 이름→ID 해석 API 호출이 발생. 자주 쓰는 엔티티를 TTL 캐싱해 호출 횟수를 줄이고, 사용자는 ID를 몰라도 자연어로 작업 가능.
LLM이 생성한 SQL을 운영 DB에 그대로 흘리는 건 사고의 지름길. 읽기 전용 화이트리스트 + 명시적 연결 개폐 + 정적 검증의 3중 장치로, 편의성보다 안전을 우선하는 기본값을 선택.
LLM에게 SQL을 맡기려면 매 턴 스키마 컨텍스트가 필요한데, 스키마는 자주 변하지 않음. TTL 파일 캐시로 반복 조회를 제거하되 force_refresh로 즉시 갱신 경로도 확보.