8000 GitHub - sanguneo/daou-gw-mcp: unofficial daou groupware · GitHub
[go: up one dir, main page]

Skip to content

About

unofficial daou groupware

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

daou-gw-cli

Daou Office 그룹웨어를 터미널과 AI 에이전트에서 그대로 쓰기

하나의 정의에서 CLI 명령과 MCP 툴이 동시에 만들어집니다.

Node TypeScript MCP Tools

Note

비공식 도구입니다. Daou의 공식 배포물도, 공식 지원 제품도 아닙니다.


한눈에 보기

기능 대표 명령
📧 메일 목록·검색·삭제·발송 mail search --query AWS
📋 전자결재 조회 · 문서함 7종 approval box --kind tempsave
✍️ 결재 양식 검색 · 문서 임시저장 approval draft --form-id <id>
📅 캘린더 조회 · 기간별 요약 calendar summary --range week
🏢 조직도 · 직원 검색 (로컬 캐시) org search --query 플랫폼팀
📌 게시판 작성·수정·첨부 board create --board-id 1 ...
🕘 월간 근태 현황 조회 attend history
🔌 MCP 서버 (stdio) daou-gw-mcp

목차


설치

npm install -g daou-gw-cli

에이전트별 지침 경로, 스킬 설치 위치, MCP 등록 명령은 **에이전트 설치 가이드**를 참고하세요.

저장소를 직접 내려받아 에이전트 설정까지 자동 적용하려면:

저장소 루트에서 bash scripts/install-agent.sh를 실행하세요.

설치 확인:

daou-gw-cli session

요구사항 — Node.js 20 이상, npm, Daou Office 계정


빠른 시작

# 1) 기본 설정
daou-gw-cli config set --base-url https://gw.example.com --username <아이디> --password <비밀번호>

# 2) 로그인
daou-gw-cli login --username <아이디> --password <비밀번호>

# 3) 확인
daou-gw-cli session

Important

그룹웨어는 사용자당 세션 1개만 유지합니다. /api/login은 새 SSO 토큰을 발급하면서 이전 토큰을 모두 무효화하므로, 이 CLI가 로그인하면 브라우저 · 메신저 · 휴대폰이 전부 로그아웃됩니다. User-Agent나 디바이스 헤더를 바꿔도 마찬가지입니다.

그래서 세션이 만료되면 CLI는 다시 로그인하지 않고, 이미 살아있는 세션을 빌려옵니다.

# 이 PC의 메신저(aegisepMessenger) 세션을 자동으로 빌려오기
daou-gw-cli session adopt

# 브라우저 개발자도구 > Application > Cookies의 GOSSOcookie 값을 직접 넘기기
daou-gw-cli session adopt --token <GOSSOcookie>

# (원한다면) 로그아웃을 감수하고 자동 재로그인 허용
daou-gw-cli config set --auto-login

빌려온 세션은 같은 토큰을 함께 쓰는 것이라 다른 클라이언트는 로그인 상태를 유지합니다. 반대로 CLI가 로그인해서 브라우저가 튕겼다면 daou-gw-cli session handoff가 출력하는 주소를 브라우저에서 열어 세션을 되돌릴 수 있습니다(토큰은 1회용이라 그 뒤 CLI는 다시 session adopt가 필요합니다).


명령어

모든 명령은 --json으로 원본 응답을 출력합니다. 플래그가 기억나지 않으면 추측하지 말고 daou-gw-cli <명령> --help — 도움말은 실제 스키마에서 생성되므로 항상 정확합니다.

📧 메일

daou-gw-cli mail list   [--folder Inbox] [--page 1] [--size 20]
daou-gw-cli mail search --query <text> [--folder Inbox] [--page 1] [--size 20]
daou-gw-cli mail delete --id <mail-id> [--id <mail-id> ...] [--folder Inbox]
daou-gw-cli mail send   --to <email[,email...]> --subject <text> \
                        (--content <html> | --html-file <path> | --image <path>) \
                        [--cc <email>] [--bcc <email>] [--from-email <email>] [--reserved-at <iso>] \
                        [--transport auto|smtp|web]
  • 발송 경로: 기본(auto)은 그룹웨어 SMTP(기본 <base_url 호스트>:25, STARTTLS, 저장된 비밀번호로 인증)로 보내고, SMTP가 실패하거나 비밀번호가 없으면 웹 API로 fallback합니다. --image/--reserved-at은 웹 전용이라 바로 웹으로 보냅니다.

  • SMTP로 보낸 메일은 IMAP(기본 993)으로 보낸편지함에 복사본을 넣습니다(--save-sent false면 생략).

  • 설정: mail_transport, smtp_host, smtp_port, imap_port (env DAOU_MAIL_TRANSPORT, DAOU_SMTP_HOST, DAOU_SMTP_PORT, DAOU_IMAP_PORT)

  • 발신자 주소·이름 우선순위: --from-email/--from-name → 설정 mail_sender_email/mail_sender_name → DAOU_MAIL_SENDER_EMAIL/DAOU_MAIL_SENDER_NAME → 로그인한 사용자의 그룹웨어 프로필(이메일·이름). 보통은 아무것도 설정할 필요가 없습니다.

  • --image는 업로드 후 본문에 <img>로 삽입되고, --reserved-at을 주면 예약 발송으로 전환됩니다.

📋 전자결재 조회

daou-gw-cli approval todo      [--type all|wait|hold] [--keyword <text>] [--from-date YYYY-MM-DD]
daou-gw-cli approval reference [--kind reference|read|view]
daou-gw-cli approval count
daou-gw-cli approval box       [--kind <문서함>] [--page 1] [--size 20] [--keyword <text>]
daou-gw-cli approval document  --document-id <id>
daou-gw-cli leavecount [--form-id <id>] [--dept-id <id>]

approval box는 그룹웨어 문서함을 그대로 엽니다.

--kind 문서함 --kind 문서함
draft (기본) 기안문서 send 발송문서
tempsave 임시문서 official 공문문서
approve 결재문서 reception 수신문서
viewer 참조/열람문서

함마다 정렬 기준이 다르며 CLI가 알아서 맞춥니다. 수신·임시 문서함은 날짜 범위 필터를 지원하지 않습니다. leavecount는 사용/잔여/추가/총 연차를 출력합니다. 양식 id는 approval form-search로 찾은 뒤 DAOU_LEAVE_FORM_ID에 저장합니다. 부서 id는 자동 탐색하며, 필요하면 DAOU_LEAVE_DEPT_ID로 지정합니다.

✍️ 전자결재 작성

# 1) 양식 찾기
daou-gw-cli approval form-search --query 휴가
#    결과에서 사용할 양식 id 확인

# 2) 임시저장 문서 만들기
daou-gw-cli approval draft --form-id <id> --title "휴가 신청"

# 3) 임시문서함에서 확인
daou-gw-cli approval box --kind tempsave

Important

draft는 임시저장까지만 합니다. 상신(결재 올리기) 기능은 의도적으로 넣지 않았습니다. 이어서 작성하고 올리는 것은 그룹웨어 화면에서 하세요.

  • --dept-id를 생략하면 조직도에서 본인 기안부서를 자동으로 찾습니다.
  • --content를 생략하면 양식 서식이 그대로 유지됩니다. 양식 변수는 --variables로 채웁니다.
  • 전체 양식 목록은 daou-gw-cli approval forms.

📅 캘린더

daou-gw-cli calendar list    [--calendar-id <id[,id...]>] [--from-date YYYY-MM-DD] [--to-date YYYY-MM-DD]
daou-gw-cli calendar summary [--range today|day|week|month] [--date YYYY-MM-DD] [--following]   # --following: 구독한 동료 캘린더 포함 (list도 동일)
daou-gw-cli calendar upcoming [--within <minutes>]   # N분 안에 시작하는 시간지정 일정 (알림용)
  • --calendar-id를 생략하면 내 캘린더 전체. 날짜를 생략하면 오늘부터 7일. 모든 날짜는 KST 기준입니다.
  • summary는 건수·종일/시간지정 구분·캘린더별 집계·일자별 목록을 출력합니다. 주간은 월~일, 월간은 1일~말일.
  • 휴일 캘린더가 범위 밖 일정까지 반환하므로 summary는 범위 밖 항목을 잘라냅니다.

🏢 조직도 · 직원

daou-gw-cli org tree   [--members]
daou-gw-cli org search [--query <text>] [--limit 20] [--refresh]
조직도
+ 예시회사 (#1)
  + 기술본부 (#2)
    + 플랫폼팀 (#3)
      + 개발파트 (#4)
  • search는 이름·부서·직위·이메일·사번·전화번호를 한 번에 훑습니다.
  • 직원 목록은 ~/.daou/directory.json에 24시간 캐시됩니다. 캐시가 살아 있으면 네트워크 없이 검색하고, --refresh로 강제 갱신합니다.

📌 게시판

daou-gw-cli board create --board-id <id> --subject <text> --content <html>
daou-gw-cli board update --board-id <id> --post-id <id> --subject <text> --content <html>
daou-gw-cli board attach --board-id <id> --post-id <id> --file <path>

HTML 본문에서 로컬 파일을 이렇게 참조하면 자동 업로드 후 src가 치환됩니다.

<img src="[{/absolute/path/image.png}]" alt="...">

Windows 경로(C:\...)도 그대로 씁니다. 이미지는 인라인으로, 그 외 파일은 첨부로 올라가며 .mp4는 게시 후 영구 첨부 URL로 다시 치환됩니다.

🕘 근태

daou-gw-cli attend history [--month YYYY-MM]

월간 근태표에서 일자별 출퇴근 시각·근무시간, 지각·조퇴·결근·휴일 집계, 월 합계를 보여줍니다. 아직 오지 않은 날짜는 집계에서 제외합니다. 출퇴근 처리 명령은 제공하지 않습니다.


MCP 서버

daou-gw-mcp

stdio 트랜스포트로 동작합니다. 각 툴의 inputSchema는 CLI 플래그와 같은 정의에서 생성되므로 두 표면이 어긋나지 않습니다.

제공 툴 25개
도메인 툴
설정·인증 config_show config_set login session session_adopt session_handoff
메일 mail_list mail_search mail_delete mail_send
캘린더 calendar_list calendar_summary
전자결재 approval_todo approval_reference approval_count approval_leave_count approval_box approval_document
결재 작성 approval_form_tree approval_form_search approval_draft_create
게시판 board_post_create board_post_update board_post_attach
조직 org_tree org_search
근태 조회 attend_history

설정과 저장 위치

파일 내용
~/.daou/config.json 설정 (비밀번호는 aes-256-gcm 암호화)
~/.daou/session.json 세션 쿠키
~/.daou/vault.key 비밀번호 암호화 키
~/.daou/directory.json 직원 디렉터리 캐시 (24시간)
환경변수 — 설정 파일에 값이 없을 때만 사용되는 폴백

저장된 설정이 항상 우선입니다.

환경변수 대응 설정
DAOU_BASE_URL base_url
DAOU_USERNAME username
DAOU_PASSWORD password
DAOU_LEAVE_FORM_ID leave_form_id
DAOU_LEAVE_DEPT_ID leave_dept_id
DAOU_MAIL_LIST_URL mail_list_url
DAOU_MAIL_SEARCH_URL mail_search_url
DAOU_MAIL_DELETE_URL mail_delete_url
DAOU_MAIL_SEND_URL mail_send_url
DAOU_MAIL_IMAGE_UPLOAD_URL mail_image_upload_url
DAOU_MAIL_SENDER_EMAIL mail_sender_email
DAOU_MAIL_SENDER_NAME mail_sender_name
DAOU_MAIL_TRANSPORT mail_transport
DAOU_SMTP_HOST smtp_host
DAOU_SMTP_PORT smtp_port
DAOU_IMAP_PORT imap_port
DAOU_BOARD_CREATE_URL board_create_url
DAOU_BOARD_UPDATE_URL board_update_url
DAOU_BOARD_ATTACH_URL board_attach_url
DAOU_BOARD_IMAGE_UPLOAD_URL board_image_upload_url

구조

src/
├── core/       설정 · 저장 · HTTP · 세션 · 시간 · 오퍼레이션 레지스트리
├── api/        그룹웨어 HTTP 호출 (mail, calendar, approval, board, attendance, organization)
├── render/     사람이 읽는 한국어 출력
├── ops/        기능 정의 = 스키마 + 실행 + 렌더 연결
├── surfaces/   ops로부터 CLI와 MCP 서버를 생성
└── tests/

핵심은 src/ops/ 입니다. 기능 하나가 오퍼레이션 하나로 정의되고, CLI 명령과 MCP 툴은 거기서 자동 생성됩니다. 같은 기능을 CLI와 MCP에 두 번 배선하지 않습니다.


기능 추가하는 법

1. 필요하면 src/api/에 HTTP 호출을, src/render/에 출력 포맷을 추가합니다.

2. src/ops/<도메인>.ts에 오퍼레이션을 정의합니다.

export const mailList = defineOperation({
  id: 'mail.list',              // 내부 식별자
  tool: 'mail_list',            // MCP 툴 이름
  cli: ['mail', 'list'],        // CLI 경로 → daou-gw-cli mail list
  summary: 'List mail using the saved session',
  input: z.strictObject({       // CLI 플래그와 MCP 스키마가 여기서 생성됨
    folder: z.string().optional().describe('Mail folder'),
    size: z.number().int().min(1).default(20).describe('Items per page'),
  }),
  auth: true,                   // 세션 필요 (만료 시 살아있는 세션을 빌려옴)
  run: async (ctx, input) => ({ data, text }),
});

3. src/ops/index.ts의 OPERATIONS에 추가합니다.

끝입니다. CLI 플래그, --help, MCP inputSchema, 인자 검증이 전부 따라옵니다.

부가 옵션
필드 용도
hidden 설정에 따라 두 표면 모두에서 숨김 (근태가 사용)
schemaExtra zod로 표현 못 하는 JSON Schema 조각 (anyOf 등)
cliAlias 생성될 플래그 이름 변경 (sender_email → --from-email)
cliHidden CLI 플래그를 만들지 않을 속성
cliExtras CLI 전용 편의 옵션 (--html-file 등)

설정 항목을 추가할 때는 src/core/config.ts의 CONFIG_FIELDS에 한 줄만 넣으면 config set 플래그, config_set MCP 인자, DAOU_* 환경변수 폴백이 함께 생깁니다.


개발

npm run dev          # CLI
npm run dev:mcp      # MCP 서버
npm test             # vitest
npm run typecheck    # tsc --noEmit
npm run build        # tsup

빌드 산출물(dist/)은 저장소에 커밋하지 않습니다. 설치 시 npm run build로 생성됩니다.



라이선스 및 권리 고지

별도의 오픈소스 라이선스는 두지 않습니다. 배포·사용·재배포는 Daou의 정책과 라이선스를 따릅니다.

코드 권한을 제외한 모든 권리(상표, 서비스, 데이터, UI, API, 문서, 운영 정책 등)는 Daou에 귀속됩니다.

Daou의 명시적 허가 없이 이 프로젝트를 공식 제품·공식 문서·공식 지원으로 오인해서는 안 됩니다.

요청이 있으면 프로젝트는 삭제될 수 있습니다.

About

unofficial daou groupware

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

0