> 인사책 MCP 문서 — 근태. 서버 주소 https://insacheck.com/api/mcp. 전체판 https://insacheck.com/docs/mcp.md · 색인 https://insacheck.com/docs/mcp/llms.txt

# 근태 (attendance)

출퇴근 찍기 · 오늘 누가 있나 · 야근과 52시간 · 출장 · 재택.

## 할 수 있는 일

- 도구 28개 · 흐름 35개 (AI 로 끝까지 28개 · 화면 안내 7개)
- ATT-01 지금 출근을 찍어요.
- ATT-02 지금 퇴근을 찍어요.
- ATT-03 내 출퇴근 기록을 봐요.
- ATT-04 잘못 찍힌 출퇴근 시각을 고쳐 달라고 올려요.
- ATT-05 출퇴근을 어떻게 하는지 안내를 받아요.
- ATT-07 한 달 출퇴근 기록을 표로 내려받아요.
- ATT-09 출퇴근 GPS 강도와 사무실 반경을 바꿔요.
- ATT-10 우리 팀 오늘 출근 기록을 봐요.
- ATT-13 올린 출퇴근 정정이 어디까지 갔는지 봐요.
- ATT-14 올린 출퇴근 정정을 거둬요.
- ATT-15 이번 주 52시간이 넘을 사람을 점검해요.
- ATT-16 이번 달 내 근무시간 합계를 봐요.
- ATT-17 지금 회사에 있는 사람을 봐요.
- ATT-18 그날 사람별 첫 출근과 마지막 퇴근을 봐요.
- ATT-19 우리 팀 이번 달 근무시간을 정리해요.
- ATT-20 팀원의 근무일에 근무조를 정해요.
- ATT-21 여러 사람의 교대표를 패턴으로 한 번에 만들어요.
- ATT-23 오늘 출근 안 한 사람과 이상 징후를 봐요.
- ATT-24 한 직원의 이번 달 근무시간을 봐요.
- ATT-25 우리 팀 야근이 많은 사람 순위를 봐요.
- ATT-26 우리 팀 외근 나간 사람과 신청 대기를 봐요.
- ATT-29 외근을 나간다고 신청해요.
- ATT-30 연장근무를 미리 신청해요.
- ATT-31 이번 달 내 연장근무 시간을 봐요.
- ATT-32 오늘 부서별 출근율을 봐요.
- ATT-33 내가 올린 외근 신청 상태를 봐요.
- ATT-34 내가 올린 출장 신청 상태를 봐요.
- ATT-35 출장을 가겠다고 신청해요.

## 도구

조회는 `run_read`, 쓰기는 `run_write` 에 도구 이름(`tool`)과 값(`args`)을 넣어 불러요. 「이름 그대로」인 기본 도구는 바로 불러요. 등급은 0 바로 조회 · 1 바로 하고 5분 안에 되돌리기 · 2 미리보기 → 확정 · 3 앱 승인이에요.

| 이름 | 조회/쓰기 | 등급 | 필요 역할 | 범위 | 설명 | 부르는 길 |
|---|---|---|---|---|---|---|
| `clock_in` | 쓰기 | 2 미리보기 → 확정 | employee (직원) | mine | 본인 출근을 기록합니다. "출근 찍어줘", "출근 처리" 같은 명령에 사용하세요. NFC 없이 MCP 만으로 출근 처리. | run_write |
| `clock_out` | 쓰기 | 2 미리보기 → 확정 | employee (직원) | mine | 본인 퇴근을 기록합니다. "퇴근 찍어줘" 같은 명령에 사용하세요. | run_write |
| `query_my_attendance` | 조회 | 0 바로 조회 | employee (직원) | view | 본인의 이번 주 출퇴근 기록을 조회합니다. "내가 이번주 몇시간 일했어?", "내 출퇴근 보여줘" 같은 질문에 사용하세요. | run_read |
| `query_attendance_today` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 오늘 우리 회사 직원들의 출퇴근 기록을 조회합니다. "오늘 누가 출근했어?", "오늘 출퇴근 현황" 같은 질문에 사용하세요. | run_read |
| `query_who_is_in` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 지금 회사에 있는 사람(출근 후 퇴근 안 한 사람) 목록을 조회합니다. "지금 누가 회사에 있어?", "현재 남아있는 사람" 같은 질문에 사용하세요. | run_read |
| `query_attendance_rate_today` | 조회 | 0 바로 조회 | hr_manager (관리자 이상) | view | 오늘 부서별 출근율. "오늘 출근율?", "부서별 출근 현황" 같은 질문에 사용. 대표관리자 또는 인사 권한. | run_read |
| `query_attendance_anomaly` | 조회 | 0 바로 조회 | hr_manager (관리자 이상) | view | 근태 이상 징후를 감지합니다 (오늘 무단결근, 주52시간 임박, 오래된 미승인 결재). "요즘 이상한 거 없어?", "리스크 점검", "문제 있어?" 같은 질문에 사용. 인사 권한 필요. 오늘 미출근 명단은 기본 10명씩 — 더 있으면 has_more 와 next_cursor (다음 쪽은 미출근 명단만). | run_read |
| `query_team_attendance` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 본인 팀의 오늘 출퇴근 현황을 조회합니다. "우리팀 오늘 누구 출근했어?" 같은 질문에 사용하세요. 부서장 이상. | run_read |
| `query_my_work_hours` | 조회 | 0 바로 조회 | employee (직원) | view | 본인의 이번달(또는 지정월) 총 근무시간/연장/야간을 조회합니다. "이번달 내 근무시간?", "내가 몇시간 일했어?" 같은 질문에 사용. | run_read |
| `query_employee_work_hours` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 특정 직원의 근무시간을 조회합니다. "이주영 이번달 몇시간 일했어?" 같은 질문에 사용. 부서장은 본인 팀원만, 인사 권한 필요은 전사. | run_read |
| `query_team_work_hours` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 본인 팀 전체의 이번달 근무시간을 직원별로 정리합니다. "우리팀 이번달 근로시간 정리해줘" 같은 질문에 사용. 부서장 이상. | run_read |
| `submit_overtime_request` | 쓰기 | 2 미리보기 → 확정 | employee (직원) | send | 연장(시간외) 근무를 사전 신청합니다. "오늘 저녁 2시간 야근 신청", "내일 18시부터 21시까지 연장근무 신청" 같은 명령에 사용. 주52시간 한도/임금 분쟁의 핵심 증거가 되는 사전 승인 기록입니다. 결재 대기(submitted)로 등록됩니다. | run_write |
| `query_my_overtime` | 조회 | 0 바로 조회 | employee (직원) | view | 본인의 이번달 연장/야간 근로 시간을 조회합니다. "이번달 내 야근 얼마야?" 같은 질문에 사용. | run_read |
| `query_team_overtime` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 본인 팀의 야근 시간 순위 (기간 지정). "우리팀 이번주 야근 누가 많아?" 같은 질문에 사용. 부서장 이상. | run_read |
| `query_team_overtime_today` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 오늘 야근(8시간 초과 또는 22시 이후 퇴근 안함) 중인 본인 팀원. "금일 야근 중인 우리팀원 누구야?" 같은 질문에 사용. 부서장 이상. | run_read |
| `query_overtime_summary` | 조회 | 0 바로 조회 | owner (대표) | view | 지정한 기간의 연장근로(야근) 시간을 직원별로 집계합니다. "이번주 야근시간 누가 가장 많아?", "야간 근로자 누구" 같은 질문에 사용하세요. | run_read |
| `query_company_overtime_cost` | 조회 | 0 바로 조회 | owner (대표) | view | 회사 전체의 연장근로/야간근로 시간 + 추정 야간수당 지급액. "이번주 야근수당 얼마야?", "이번달 야간근로 수당 얼마야?" 같은 질문에 사용하세요. 대표관리자 전용. | run_read |
| `query_overtime_threshold_breach` | 조회 | 0 바로 조회 | hr_manager (관리자 이상) | view | 지정 기간 야근(연장) 시간이 임계값 초과한 직원. "이번달 야근 30시간 넘은 사람?" 같은 질문에 사용. 인사 권한 필요. | run_read |
| `check_52h_compliance` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 주 52시간 근로제 준수 점검 — 이번주 총근로 52시간 초과(또는 임박) 직원. "주52시간 위반 위험자 누구?" 같은 질문에 사용. 인사 권한이면 전사, 부서장은 본인 팀만. | run_read |
| `submit_business_trip` | 쓰기 | 2 미리보기 → 확정 | employee (직원) | send | 출장/외근을 신청합니다. "다음주 부산 출장 신청", "내일 고객사 방문 외근" 같은 명령에 사용. | run_write |
| `query_my_trips` | 조회 | 0 바로 조회 | employee (직원) | view | 본인 출장 신청 목록. "내 출장 신청 현황" 같은 질문에 사용. | run_read |
| `request_remote_work` | 쓰기 | 2 미리보기 → 확정 | employee (직원) | send | 외근을 신청합니다. "오늘 외근", "내일 고객사 외근 신청" 같은 명령에 사용. 사업장 밖에서 일하는 날을 승인받아 기록. | run_write |
| `query_my_remote_work` | 조회 | 0 바로 조회 | employee (직원) | view | 본인 외근 신청 내역. "내 외근 신청 어떻게 됐어?" 같은 질문에 사용. | run_read |
| `query_remote_work` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 외근 현황. "오늘 외근 누구야?", "이번주 외근자", "외근 신청 대기" 같은 질문에 사용. 부서장은 본인 부서. 부서장 이상. | run_read |
| `export_attendance_csv` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 근태(출퇴근) 데이터를 CSV로 내보냅니다(최대 300건 · 넘으면 웹 근로시간 대장 링크). "이번달 근태 다운로드", "출퇴근 기록 엑셀로 줘" 같은 명령에 사용. 결과 CSV를 파일로 저장하면 됩니다. 부서장 이상. | run_read |
| `attendance_month_close` | 쓰기 | 3 앱 승인 | hr_manager (관리자 이상) | admin | 한 달 근태를 마감하거나 마감을 풉니다. "11월 근태 마감해줘", "11월 마감 풀어줘" 같은 명령에 사용. 마감하면 그 달 근태 정정 반영·관리자 근태 수정이 막혀요(출퇴근 찍기는 그대로). 지난 달만 마감할 수 있어요. 되돌리기 어려운 일이라 인사책 앱에서 사람이 승인해야 반영돼요 — 부르면 앱으로 승인 요청이 가고, 승인한 뒤 같은 인자로 다시 부르면 반영돼요. action 을 안 주면 마감(close)이고, 풀려면 reopen. 인사 권한 필요. | run_write |
| `query_my_week_52h` | 조회 | 0 바로 조회 | employee (직원) | view | 본인의 이번주 근무시간과 주 52시간까지 남은 시간을 알려줍니다. "이번 주 얼마 일했어? 52시간 얼마나 남았어?" 같은 질문에 사용. | run_read |
| `query_team_late_absent` | 조회 | 0 바로 조회 | dept_manager (팀장 이상) | view | 본인 팀의 오늘 근태 이상 — 지각한 팀원과 아직 출근 기록이 없는(미출근) 팀원. "우리 팀 오늘 지각·누락 있어?" 같은 질문에 사용. 부서장 이상. | run_read |

도구마다 따로 읽는 문서: [clock_in](https://insacheck.com/docs/mcp/tools/clock_in.md) · [clock_out](https://insacheck.com/docs/mcp/tools/clock_out.md) · [query_my_attendance](https://insacheck.com/docs/mcp/tools/query_my_attendance.md) · [query_attendance_today](https://insacheck.com/docs/mcp/tools/query_attendance_today.md) · [query_who_is_in](https://insacheck.com/docs/mcp/tools/query_who_is_in.md) · [query_attendance_rate_today](https://insacheck.com/docs/mcp/tools/query_attendance_rate_today.md) · [query_attendance_anomaly](https://insacheck.com/docs/mcp/tools/query_attendance_anomaly.md) · [query_team_attendance](https://insacheck.com/docs/mcp/tools/query_team_attendance.md) · [query_my_work_hours](https://insacheck.com/docs/mcp/tools/query_my_work_hours.md) · [query_employee_work_hours](https://insacheck.com/docs/mcp/tools/query_employee_work_hours.md) · [query_team_work_hours](https://insacheck.com/docs/mcp/tools/query_team_work_hours.md) · [submit_overtime_request](https://insacheck.com/docs/mcp/tools/submit_overtime_request.md) · [query_my_overtime](https://insacheck.com/docs/mcp/tools/query_my_overtime.md) · [query_team_overtime](https://insacheck.com/docs/mcp/tools/query_team_overtime.md) · [query_team_overtime_today](https://insacheck.com/docs/mcp/tools/query_team_overtime_today.md) · [query_overtime_summary](https://insacheck.com/docs/mcp/tools/query_overtime_summary.md) · [query_company_overtime_cost](https://insacheck.com/docs/mcp/tools/query_company_overtime_cost.md) · [query_overtime_threshold_breach](https://insacheck.com/docs/mcp/tools/query_overtime_threshold_breach.md) · [check_52h_compliance](https://insacheck.com/docs/mcp/tools/check_52h_compliance.md) · [submit_business_trip](https://insacheck.com/docs/mcp/tools/submit_business_trip.md) · [query_my_trips](https://insacheck.com/docs/mcp/tools/query_my_trips.md) · [request_remote_work](https://insacheck.com/docs/mcp/tools/request_remote_work.md) · [query_my_remote_work](https://insacheck.com/docs/mcp/tools/query_my_remote_work.md) · [query_remote_work](https://insacheck.com/docs/mcp/tools/query_remote_work.md) · [export_attendance_csv](https://insacheck.com/docs/mcp/tools/export_attendance_csv.md) · [attendance_month_close](https://insacheck.com/docs/mcp/tools/attendance_month_close.md) · [query_my_week_52h](https://insacheck.com/docs/mcp/tools/query_my_week_52h.md) · [query_team_late_absent](https://insacheck.com/docs/mcp/tools/query_team_late_absent.md)

## 말 → 호출 순서 (흐름)

### ATT-01 지금 출근을 찍어요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「출근 찍어줘」 「나 출근했어」 「출근 처리 부탁해」 「외근 나와서 출근할게」

호출 순서 (POST /api/mcp · tools/call):

```text
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"clock_in","args":{"note":"외근"}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:_clockToggle · 함수 src/lib/attendance-submission.ts:submitAttendance · 웹 API POST /api/attendance {type, note}
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"clock_in","args":{"note":"외근"},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tool-handlers.ts:_clockToggle · 함수 src/lib/attendance-submission.ts:submitAttendance · 웹 API POST /api/attendance {type, note}
     다음으로 넘길 값: 출근 시각
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요. / 메모(외근 등)는 말에 있을 때만 넣어요.
- 끝: 오늘 출근 기록이 한 줄 생겨요.
- 화면: 홈 → 출근 단추 (/worker)
- 하면 안 되는 것: 확인 없이 확정하지 않아요. / 남의 출근을 찍지 않아요.

### ATT-02 지금 퇴근을 찍어요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「퇴근 찍어줘」 「이제 퇴근할게」 「퇴근 처리해 줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"clock_out","args":{}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:_clockToggle · 함수 src/lib/attendance-submission.ts:submitAttendance · 웹 API POST /api/attendance {type, note}
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"clock_out","args":{},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tool-handlers.ts:_clockToggle · 함수 src/lib/attendance-submission.ts:submitAttendance · 웹 API POST /api/attendance {type, note}
     다음으로 넘길 값: 퇴근 시각
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요. / 오늘 출근 기록이 먼저 있어야 해요.
- 끝: 오늘 퇴근 시각이 기록돼요.
- 화면: 홈 → 퇴근 단추 (/worker)
- 하면 안 되는 것: 확인 없이 확정하지 않아요. / 출근 기록 없이 퇴근을 만들지 않아요.

### ATT-03 내 출퇴근 기록을 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「내 출퇴근 보여줘」 「이번 주 몇 시에 출근했지?」 「지난 2주 출퇴근 기록」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_attendance","args":{"days":14}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:query_my_attendance
```

- 필요한 값 · 되묻기: 며칠치인지 말이 없으면 7일로 봐요.
- 끝: 날마다 출근 · 퇴근 시각을 보여 줘요.
- 화면: 출퇴근 기록 (/worker/history)
- 하면 안 되는 것: 다른 사람 기록을 이 흐름으로 보지 않아요.

### ATT-04 잘못 찍힌 출퇴근 시각을 고쳐 달라고 올려요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「어제 퇴근 시간 잘못 찍혔어, 정정 올려줘」 「10월 20일 퇴근 20시 30분으로 고쳐줘」 「퇴근 시각 정정 신청해 줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"approval_preview","args":{"type":"attendance_fix"}}}
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:engineLine
     다음으로 넘길 값: 결재자 이름
  (값이 없으면 먼저 물어요: 「며칠 몇 시로 고칠까요?」)
  2-미리보기. tools/call {"name":"approval_request","arguments":{"type":"attendance_fix","day":"2026-10-20","checkout_time":"20:30","reason":"야근 뒤 퇴근 시각이 잘못 찍힘"}}
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan · 함수 src/lib/attendance-correction-submit-core.ts:attendanceCorrectionSubmitCore · 웹 API POST /api/workers/me/attendance-corrections {date, checkin_time, checkout_time, reason}
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「결재를 누구에게 올릴까요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"approval_request","arguments":{"type":"attendance_fix","day":"2026-10-20","checkout_time":"20:30","reason":"야근 뒤 퇴근 시각이 잘못 찍힘","confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan · 함수 src/lib/attendance-correction-submit-core.ts:attendanceCorrectionSubmitCore · 웹 API POST /api/workers/me/attendance-corrections {date, checkin_time, checkout_time, reason}
     다음으로 넘길 값: 결재 id
```

- 필요한 값 · 되묻기: 날짜(어제부터 30일 안) / 고칠 출근 또는 퇴근 시각 / 사유 / 그날 기록이 이미 있어야 시각을 바꿀 수 있어요.
- 끝: 정정 결재가 올라가고, 승인되면 기록이 바뀌어요.
- 화면: 근태 정정 신청 (/worker/attendance-correction)
- 하면 안 되는 것: 기록을 지우지 않아요 — 정정 신청으로만 고쳐요. / 결재자를 마음대로 고르지 않아요. / 없는 퇴근을 새로 만들지 않아요.

### ATT-05 출퇴근을 어떻게 하는지 안내를 받아요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「출퇴근 어떻게 해?」 「출근 방법 알려줘」 「출근 불가 지역이라고 떠요」 「출퇴근 안내 보여줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"guide","arguments":{"topic":"attendance"}}
     서버: 몸통 src/routes/mcp-tools/base-guide.ts:guide
     다음으로 넘길 값: 안내 내용
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요. / 궁금한 점이 있으면 그 칸을 먼저 알려요.
- 끝: 내 역할에 맞는 출퇴근 안내 한 장을 보여 줘요.
- 화면: 홈 → 출근하기 · 퇴근하기 (/worker/dashboard)
- 하면 안 되는 것: 안내만 하고 출퇴근을 대신 찍지 않아요. / 없는 단추 이름을 지어내지 않아요.

### ATT-06 직원의 출퇴근 기록을 관리자가 대신 고쳐요.
- 누가: 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「김가상 어제 퇴근 18시로 고쳐줘」 「직원 출근 기록 수정하고 싶어」 「이가상 10월 20일 기록 정정해줘」 「새벽에 퇴근한 기록 반영해 줘」
- 호출 순서: 없음(화면에서 해요)
- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 고칠 사람과 날짜를 정해요. / 바꿀 출근 또는 퇴근 시각을 적어요.
- 끝: 관리자가 고친 근무 기록이 화면에서 저장돼요.
- 화면: 기록 → 근무기록 수정 (/worker/attendance-correction)
- 하면 안 되는 것: AI 가 기록을 마음대로 만들지 않아요. / 직원 본인 신청과 헷갈리지 않아요.

### ATT-07 한 달 출퇴근 기록을 표로 내려받아요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「이번 달 출퇴근 기록 엑셀로 줘」 「10월 근태 다운로드」 「월별 출퇴근 기록 뽑아줘」 「전 직원 근태 표로 받고 싶어」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"export_attendance_csv","args":{"month":"2026-10"}}}
     서버: 몸통 src/routes/mcp-tools/export.ts:export_attendance_csv
     다음으로 넘길 값: 표 내용
```

- 필요한 값 · 되묻기: 월 말이 없으면 이번 달이에요. / 부서장은 맡은 팀 기록만 받아요.
- 끝: 그 달 출퇴근 기록을 표 글자로 받아요.
- 화면: 일하기 → 출퇴근 현황 (/admin/enterprise/attendance)
- 하면 안 되는 것: 파일을 만들어 메일로 보내지 않아요. / 다른 팀 기록을 받지 않아요.

### ATT-08 출퇴근을 찍는 방법을 켜고 꺼요.
- 누가: 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「NFC로만 출퇴근되게 해줘」 「GPS 끄고 싶어」 「수동 버튼 출퇴근도 같이 쓰고 싶어」 「출퇴근 방법 바꿔줘」
- 호출 순서: 없음(화면에서 해요)
- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 켜고 끌 방법을 정해요.
- 끝: 출퇴근 방법 설정이 화면에서 바뀌어요.
- 화면: 설정 → 출근 확인 (/admin/enterprise/attendance-methods)
- 하면 안 되는 것: AI 가 방법을 바꿨다고 말하지 않아요. / 한 사람만 다르게 하는 일은 근무규정 화면에서 해요.

### ATT-09 출퇴근 GPS 강도와 사무실 반경을 바꿔요.
- 누가: 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「GPS 반경 150미터로 해줘」 「출퇴근 GPS를 느슨하게 바꿔줘」 「사무실 인정 거리 넓혀줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  (값이 없으면 먼저 물어요: 「GPS 강도와 반경을 어떻게 할까요?」)
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"update_attendance_policy","args":{"gps_mode":"soft","office_radius_m":150}}}
     서버: 몸통 src/routes/mcp-tools/enterprise-settings.ts:update_attendance_policy
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"update_attendance_policy","args":{"gps_mode":"soft","office_radius_m":150},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/enterprise-settings.ts:update_attendance_policy
     다음으로 넘길 값: 바뀐 값
```

- 필요한 값 · 되묻기: 바꿀 GPS 강도나 반경(20~5000미터)을 말해요. / 값이 없으면 되물어요.
- 끝: GPS 강도는 회사 전체, 반경은 첫 사업장에 바뀌어요.
- 화면: 설정 → 일하는 곳 (/admin/enterprise/hr/office-location)
- 하면 안 되는 것: 확인 없이 바꾸지 않아요. / 사업장마다 다르게 걸지 않아요.

### ATT-10 우리 팀 오늘 출근 기록을 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「오늘 우리 팀 출근 현황」 「팀원 누구 출근했어?」 「영업1팀 오늘 출퇴근 보여줘」 「어제 팀 출퇴근 기록 줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_team_attendance","args":{"date":"2026-10-21","limit":10}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:query_team_attendance
```

- 필요한 값 · 되묻기: 날짜 말이 없으면 오늘이에요. / 10명씩 보여 주고 더 있으면 이어서 봐요.
- 끝: 그날 찍힌 출퇴근 기록을 사람별로 보여 줘요.
- 화면: 관리 → 출퇴근현황 (/worker/team)
- 하면 안 되는 것: 다른 팀 기록을 보지 않아요. / 지각 여부를 짐작해서 말하지 않아요.

### ATT-11 점심 외출과 복귀 시각을 기록해요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「점심 외출 기록하고 싶어」 「외출했다가 복귀 찍어줘」 「휴식 단추 어디 있어?」 「외출 시간은 어떻게 빼요?」
- 호출 순서: 없음(화면에서 해요)
- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 외출과 복귀는 홈 단추로 눌러요.
- 끝: 외출과 복귀 시각이 기록에 남아요.
- 화면: 홈 → 휴식·식사 단추 (/worker/dashboard)
- 하면 안 되는 것: 외출 기록을 AI 가 대신 만들지 않아요. / 공제 시간을 짐작해서 말하지 않아요.

### ATT-12 사무실 위치와 출근 인정 거리를 등록해요.
- 누가: 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「사무실 위치 등록해줘」 「사무실 옮겼는데 위치 다시 잡아줘」 「지점 위치 추가하고 싶어」
- 호출 순서: 없음(화면에서 해요)
- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 등록할 장소 주소를 준비해요.
- 끝: 일하는 곳 위치와 거리가 화면에서 저장돼요.
- 화면: 설정 → 일하는 곳 (/admin/enterprise/hr/office-location)
- 하면 안 되는 것: 위치를 짐작해서 넣지 않아요. / AI 가 저장했다고 말하지 않아요.

### ATT-13 올린 출퇴근 정정이 어디까지 갔는지 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「정정 신청 어떻게 됐어?」 「올린 근태 정정 승인됐어?」 「내 정정 결재 누구 차례야」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"approval_list","arguments":{"box":"mine"}}
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalList
     다음으로 넘길 값: 결재 번호 · 결재 종류
  2. tools/call {"name":"run_read","arguments":{"tool":"approval_get","args":{}}}
     넘겨받는 값: 1.items.0.id → id · 1.items.0.type → type
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalGet
     다음으로 넘길 값: 결재 상태 · 결재자 이름
```

- 필요한 값 · 되묻기: 올린 결재 중 근태 정정 건을 골라요. / 여러 건이면 가장 최근 것부터 봐요.
- 끝: 정정 결재가 어디까지 갔는지 보여 줘요.
- 화면: 결재/요청 → 결재요청 내역 (/worker/requests)
- 하면 안 되는 것: 내가 올리거나 결재할 건만 봐요. / 승인 여부를 짐작해서 말하지 않아요.

### ATT-14 올린 출퇴근 정정을 거둬요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「정정 신청 취소해줘」 「잘못 올린 근태 정정 회수할래」 「올린 정정 거둘게」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"approval_list","arguments":{"box":"mine"}}
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalList
     다음으로 넘길 값: 결재 번호 · 결재 종류
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"approval_cancel","args":{}}}
     넘겨받는 값: 1.items.0.id → id · 1.items.0.type → type
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalCancel · 웹 API POST /api/workers/me/attendance-corrections/:id/cancel
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"approval_cancel","args":{},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 1.items.0.id → id · 1.items.0.type → type · 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalCancel · 웹 API POST /api/workers/me/attendance-corrections/:id/cancel
```

- 필요한 값 · 되묻기: 거둘 정정 건을 골라요. / 아직 결재 전인 건만 거둘 수 있어요.
- 끝: 결재 전인 정정 신청이 회수돼요.
- 화면: 결재/요청 → 결재요청 내역 (/worker/requests)
- 하면 안 되는 것: 확인 없이 거두지 않아요. / 이미 승인된 정정은 거두지 않아요.

### ATT-15 이번 주 52시간이 넘을 사람을 점검해요.
- 누가: 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「주 52시간 넘을 사람 있어?」 「이번 주 52시간 위험한 사람」 「52시간 임박한 직원 알려줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"check_52h_compliance","args":{"warn_hours":48}}}
     서버: 몸통 src/routes/mcp-tools/worktime.ts:check_52h_compliance
```

- 필요한 값 · 되묻기: 경고 기준 시간이 없으면 48시간이에요.
- 끝: 52시간을 넘었거나 가까운 직원을 보여 줘요.
- 화면: 일하기 → 출퇴근 현황 (/admin/enterprise/attendance)
- 하면 안 되는 것: 법을 어겼다고 단정하지 않아요. / 직원 본인에게 알림을 보내지 않아요.

### ATT-16 이번 달 내 근무시간 합계를 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「이번 달 내 근무시간 얼마야?」 「10월에 몇 시간 일했어?」 「내 근무시간 합계 알려줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_work_hours","args":{"month":"2026-10"}}}
     서버: 몸통 src/routes/mcp-tools/worktime.ts:query_my_work_hours
```

- 필요한 값 · 되묻기: 월 말이 없으면 이번 달이에요. / 이번 주 합계는 기록 화면을 알려요.
- 끝: 그 달 근무 · 연장 · 야간 시간을 보여 줘요.
- 화면: 출퇴근 기록 (/worker/history)
- 하면 안 되는 것: 다른 사람 근무시간을 보지 않아요. / 급여 계산값이라고 말하지 않아요.

### ATT-17 지금 회사에 있는 사람을 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「지금 누가 회사에 있어?」 「현재 남아 있는 사람」 「퇴근 안 한 사람 알려줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_who_is_in","args":{}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:query_who_is_in
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요.
- 끝: 지금 일하는 중인 사람 명단을 보여 줘요.
- 화면: 관리 → 출퇴근현황 (/worker/team)
- 하면 안 되는 것: 찍힌 기록만 말하고 이유를 짐작하지 않아요.

### ATT-18 그날 사람별 첫 출근과 마지막 퇴근을 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「어제 출퇴근 기록 사람별로 보여줘」 「10월 20일 첫 출근 마지막 퇴근」 「오늘 전체 출근 기록 줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_attendance_today","args":{"date":"2026-10-20"}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:query_attendance_today
```

- 필요한 값 · 되묻기: 날짜 말이 없으면 오늘이에요.
- 끝: 그날 사람별 첫 출근과 마지막 퇴근을 보여 줘요.
- 화면: 일하기 → 출퇴근 현황 (/admin/enterprise/attendance)
- 하면 안 되는 것: 기록이 없는 사람이 안 온 건지 짐작하지 않아요.

### ATT-19 우리 팀 이번 달 근무시간을 정리해요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「우리 팀 이번 달 근무시간 정리해줘」 「팀원별 근무시간 보여줘」 「이번 달 누가 많이 일했어?」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_team_work_hours","args":{"month":"2026-10"}}}
     서버: 몸통 src/routes/mcp-tools/worktime.ts:query_team_work_hours
```

- 필요한 값 · 되묻기: 월 말이 없으면 이번 달이에요.
- 끝: 팀원별 근무 · 연장 시간을 보여 줘요.
- 화면: 관리 → 출퇴근현황 → 월별 (/worker/team/monthly-hours)
- 하면 안 되는 것: 다른 팀 사람은 보지 않아요. / 급여 계산값이라고 말하지 않아요.

### ATT-20 팀원의 근무일에 근무조를 정해요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「이가상 내일 야간조로 넣어줘」 「이가상 10월 25일 휴무로 해줘」 「박가상 목요일 주간조로 정해줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_shift_templates","args":{}}}
     서버: 몸통 src/routes/mcp-tools/shift.ts:query_shift_templates
     다음으로 넘길 값: 근무조 이름
  (값이 없으면 먼저 물어요: 「어느 근무조로 할까요?」)
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"assign_shift","args":{"worker":"이가상","work_date":"2026-10-22"}}}
     넘겨받는 값: 1.templates.0.template_id → shift_template_id
     서버: 몸통 src/routes/mcp-tools/shift.ts:assign_shift · 웹 API POST /api/admin/shift-assignments
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「같은 이름이 여럿이면 누구예요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"assign_shift","args":{"worker":"이가상","work_date":"2026-10-22"},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 1.templates.0.template_id → shift_template_id · 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/shift.ts:assign_shift · 웹 API POST /api/admin/shift-assignments
     다음으로 넘길 값: 정해진 근무
```

- 필요한 값 · 되묻기: 직원 이름과 근무일 / 근무조 이름 또는 시작 · 종료 시각 / 휴무면 근무조 대신 휴무로 정해요.
- 끝: 그 직원의 그날 근무가 정해져요.
- 화면: 관리 → 팀 운영 (/worker/team/operations)
- 하면 안 되는 것: 부서장은 맡은 팀원만 정해요. / 확인 없이 정하지 않아요.

### ATT-21 여러 사람의 교대표를 패턴으로 한 번에 만들어요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「두 명 주간 야간 휴무로 한 달 교대표 만들어줘」 「11월 교대 패턴 한 번에 넣어줘」 「영업1팀 교대표 돌려서 짜줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_shift_templates","args":{}}}
     서버: 몸통 src/routes/mcp-tools/shift.ts:query_shift_templates
     다음으로 넘길 값: 근무조 이름
  (값이 없으면 먼저 물어요: 「누구를 어떤 순서로 돌릴까요?」)
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"generate_rotation","args":{"workers":["이가상","박가상"],"pattern":["주간","야간","휴무"],"from_date":"2026-11-01","days":30}}}
     서버: 몸통 src/routes/mcp-tools/shift-ops.ts:generate_rotation
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"generate_rotation","args":{"workers":["이가상","박가상"],"pattern":["주간","야간","휴무"],"from_date":"2026-11-01","days":30},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/shift-ops.ts:generate_rotation
     다음으로 넘길 값: 만든 일수
```

- 필요한 값 · 되묻기: 사람 목록 / 돌릴 순서(근무조 이름 · 휴무) / 시작일과 일수
- 끝: 정한 기간의 교대표가 한 번에 만들어져요.
- 화면: 관리 → 팀 운영 (/worker/team/operations)
- 하면 안 되는 것: 확인 없이 만들지 않아요. / 없는 근무조 이름을 지어내지 않아요.

### ATT-22 오늘 늦게 온 사람을 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「오늘 늦은 사람 누구야?」 「지각한 사람 알려줘」 「이번 달 지각 많은 사람」
- 호출 순서: 없음(화면에서 해요)
- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 지각 기준은 근무정책 화면이 정해요.
- 끝: 명단에서 지각 표시를 화면으로 봐요.
- 화면: 관리 → 출퇴근현황 (/worker/team)
- 하면 안 되는 것: 출근 시각만 보고 지각이라고 단정하지 않아요.

### ATT-23 오늘 출근 안 한 사람과 이상 징후를 봐요.
- 누가: 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「오늘 출근 안 한 사람 누구야?」 「무단결근 있어?」 「요즘 이상한 거 없어?」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_attendance_anomaly","args":{}}}
     서버: 몸통 src/routes/mcp-tools/insights.ts:query_attendance_anomaly
```

- 필요한 값 · 되묻기: 10명씩 보여 주고 더 있으면 이어서 봐요.
- 끝: 오늘 안 온 사람과 이상 징후를 보여 줘요.
- 화면: 일하기 → 출퇴근 현황 (/admin/enterprise/attendance)
- 하면 안 되는 것: 안 온 사정을 짐작해서 말하지 않아요.

### ATT-24 한 직원의 이번 달 근무시간을 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「김가상 이번 달 근무시간 알려줘」 「이가상 몇 시간 일했어?」 「팀원 한 명 근무시간 보여줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  (값이 없으면 먼저 물어요: 「누구의 근무시간을 볼까요?」)
  1. tools/call {"name":"run_read","arguments":{"tool":"query_employee_work_hours","args":{"worker":"김가상","month":"2026-10"}}}
     서버: 몸통 src/routes/mcp-tools/worktime.ts:query_employee_work_hours
```

- 필요한 값 · 되묻기: 직원 이름 / 월 말이 없으면 이번 달이에요.
- 끝: 그 직원의 근무 · 연장 · 야간 시간을 보여 줘요.
- 화면: 관리 → 출퇴근현황 → 월별 (/worker/team/monthly-hours)
- 하면 안 되는 것: 맡은 팀 밖 사람은 보지 않아요.

### ATT-25 우리 팀 야근이 많은 사람 순위를 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「이번 주 우리 팀 야근 누가 많아?」 「야근 많은 사람 순위」 「팀 연장근무 상위 5명」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_team_overtime","args":{"start_date":"2026-10-19","end_date":"2026-10-25","top_n":5}}}
     서버: 몸통 src/routes/mcp-tools/worktime.ts:query_team_overtime
```

- 필요한 값 · 되묻기: 기간 말이 없으면 이번 주예요. / 몇 명까지 볼지 없으면 10명이에요.
- 끝: 기간 안에 야근이 많은 팀원 순위를 보여 줘요.
- 화면: 관리 → 출퇴근현황 → 월별 (/worker/team/monthly-hours)
- 하면 안 되는 것: 다른 팀은 보지 않아요.

### ATT-26 우리 팀 외근 나간 사람과 신청 대기를 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「오늘 외근 누구야?」 「이번 주 외근자 알려줘」 「외근 신청 대기 있어?」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_remote_work","args":{"date":"2026-10-21"}}}
     서버: 몸통 src/routes/mcp-tools/remote.ts:query_remote_work
```

- 필요한 값 · 되묻기: 날짜 말이 없으면 대기 중인 신청을 봐요.
- 끝: 그날 외근자 또는 대기 중인 외근 신청을 보여 줘요.
- 화면: 관리 → 출퇴근현황 (/worker/team)
- 하면 안 되는 것: 부서장은 맡은 팀만 봐요.

### ATT-27 올라온 외근 신청을 승인해요.
- 누가: 팀장 · 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「외근 신청 승인해줘」 「김가상 외근 승인」 「올라온 외근 신청 처리해줘」
- 호출 순서: 없음(화면에서 해요)
- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 결재함에서 신청을 열어 승인해요.
- 끝: 결재함에서 외근 신청이 승인돼요.
- 화면: 결재/요청 → 결재요청 내역 → 결재함 (/worker/requests)
- 하면 안 되는 것: 승인을 AI 가 대신 누르지 않아요.

### ATT-28 올라온 연장근무 신청을 승인해요.
- 누가: 팀장 · 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「연장근무 신청 승인해줘」 「야근 신청 처리해줘」 「이가상 연장근무 승인」
- 호출 순서: 없음(화면에서 해요)
- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 결재함에서 신청을 열어 승인해요.
- 끝: 결재함에서 연장근무 신청이 승인돼요.
- 화면: 결재/요청 → 결재요청 내역 → 결재함 (/worker/requests)
- 하면 안 되는 것: 승인을 AI 가 대신 누르지 않아요.

### ATT-29 외근을 나간다고 신청해요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「내일 고객사 외근 신청해줘」 「오늘 외근이야 신청할게」 「10월 22일부터 이틀 외근 올려줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  (값이 없으면 먼저 물어요: 「며칠부터 외근인가요?」)
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"request_remote_work","args":{"work_mode":"field","start_date":"2026-10-22","end_date":"2026-10-23","reason":"고객사 방문","location":"고객사"}}}
     서버: 몸통 src/routes/mcp-tools/remote.ts:request_remote_work · 웹 API POST /api/worker/remote-work
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"request_remote_work","args":{"work_mode":"field","start_date":"2026-10-22","end_date":"2026-10-23","reason":"고객사 방문","location":"고객사"},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/remote.ts:request_remote_work · 웹 API POST /api/worker/remote-work
     다음으로 넘길 값: 신청 번호
```

- 필요한 값 · 되묻기: 시작일 / 끝나는 날(없으면 하루) / 외근만 받아요 — 재택은 안 돼요.
- 끝: 외근 신청이 올라가고 팀장 승인을 기다려요.
- 화면: 출장·외근 (/worker/remote)
- 하면 안 되는 것: 확인 없이 올리지 않아요. / 재택이나 혼합 근무는 신청받지 않아요.

### ATT-30 연장근무를 미리 신청해요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「오늘 저녁 2시간 야근 신청해줘」 「내일 18시부터 21시까지 연장근무 올려줘」 「야근 신청할래」

호출 순서 (POST /api/mcp · tools/call):

```text
  (값이 없으면 먼저 물어요: 「몇 시부터 몇 시까지 하나요?」)
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"submit_overtime_request","args":{"request_date":"2026-10-21","start_time":"18:30","end_time":"21:00","reason":"월말 정산 마감 작업"}}}
     서버: 몸통 src/routes/mcp-tools/worktime.ts:submit_overtime_request · 함수 src/lib/approval-request-create.ts:createApprovalRequestWithAtomicRoute · 웹 API POST /api/worker/overtime
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"submit_overtime_request","args":{"request_date":"2026-10-21","start_time":"18:30","end_time":"21:00","reason":"월말 정산 마감 작업"},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/worktime.ts:submit_overtime_request · 함수 src/lib/approval-request-create.ts:createApprovalRequestWithAtomicRoute · 웹 API POST /api/worker/overtime
     다음으로 넘길 값: 신청 번호
```

- 필요한 값 · 되묻기: 날짜(없으면 오늘) / 시작 · 종료 시각 / 사유(5자 이상)
- 끝: 연장근무 신청이 올라가고 결재를 기다려요.
- 화면: 주말·연장 근무 (/worker/overtime)
- 하면 안 되는 것: 확인 없이 올리지 않아요. / 근무가 시작된 뒤에는 신청이 막힐 수 있어요.

### ATT-31 이번 달 내 연장근무 시간을 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「나 이번 달 연장 몇 시간이야?」 「내 야근 시간 알려줘」 「10월 연장근무 합계」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_overtime","args":{"month":"2026-10"}}}
     서버: 몸통 src/routes/mcp-tools/worktime.ts:query_my_overtime
```

- 필요한 값 · 되묻기: 월 말이 없으면 이번 달이에요.
- 끝: 그 달 연장 · 야간 시간을 보여 줘요.
- 화면: 출퇴근 기록 (/worker/history)
- 하면 안 되는 것: 야근수당 확정 금액이라고 말하지 않아요.

### ATT-32 오늘 부서별 출근율을 봐요.
- 누가: 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「오늘 출근율 얼마야?」 「부서별 출근 현황 알려줘」 「오늘 어느 부서가 많이 빠졌어?」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_attendance_rate_today","args":{}}}
     서버: 몸통 src/routes/mcp-tools/org-payroll.ts:query_attendance_rate_today
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요.
- 끝: 부서별 오늘 출근율을 보여 줘요.
- 화면: 일하기 → 출퇴근 현황 (/admin/enterprise/attendance)
- 하면 안 되는 것: 빠진 사정을 짐작해서 말하지 않아요.

### ATT-33 내가 올린 외근 신청 상태를 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「내 외근 신청 어떻게 됐어?」 「외근 승인됐어?」 「올린 외근 신청 보여줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_remote_work","args":{}}}
     서버: 몸통 src/routes/mcp-tools/remote.ts:query_my_remote_work
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요.
- 끝: 내 외근 신청과 처리 상태를 보여 줘요.
- 화면: 출장·외근 (/worker/remote)
- 하면 안 되는 것: 다른 사람 신청은 보지 않아요.

### ATT-34 내가 올린 출장 신청 상태를 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「내 출장 신청 현황」 「출장 승인됐는지 봐줘」 「올린 출장 목록 보여줘」

호출 순서 (POST /api/mcp · tools/call):

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_trips","args":{}}}
     서버: 몸통 src/routes/mcp-tools/ops.ts:query_my_trips
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요.
- 끝: 내 출장 신청과 처리 상태를 보여 줘요.
- 화면: 출장·외근 → 출장 (/worker/business-trip)
- 하면 안 되는 것: 다른 사람 신청은 보지 않아요.

### ATT-35 출장을 가겠다고 신청해요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「다음 주 부산 출장 신청해줘」 「10월 27일 고객사 방문 출장 올려줘」 「출장 신청할래」

호출 순서 (POST /api/mcp · tools/call):

```text
  (값이 없으면 먼저 물어요: 「어디로 며칠 가나요?」)
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"submit_business_trip","args":{"trip_type":"domestic_overnight","destination":"부산 고객사","purpose":"제품 시연","start_date":"2026-10-27","end_date":"2026-10-28"}}}
     서버: 몸통 src/routes/mcp-tools/ops.ts:submit_business_trip · 함수 src/lib/approval-request-create.ts:createApprovalRequestWithAtomicRoute · 웹 API POST /api/worker/business-trip
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"submit_business_trip","args":{"trip_type":"domestic_overnight","destination":"부산 고객사","purpose":"제품 시연","start_date":"2026-10-27","end_date":"2026-10-28"},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/ops.ts:submit_business_trip · 함수 src/lib/approval-request-create.ts:createApprovalRequestWithAtomicRoute · 웹 API POST /api/worker/business-trip
     다음으로 넘길 값: 신청 번호
```

- 필요한 값 · 되묻기: 출장 종류와 목적지 / 출장 목적 / 시작일(끝나는 날 없으면 하루)
- 끝: 출장 신청이 올라가고 결재를 기다려요.
- 화면: 출장·외근 → 출장 (/worker/business-trip)
- 하면 안 되는 것: 확인 없이 올리지 않아요. / 결재 없이 출장이 확정되지 않아요.

### 이 영역 도구가 나오는 다른 흐름

- PAY-11 회사 연장·야간 수당 총액을 봐요. → https://insacheck.com/docs/mcp/pay.md
- ADM-07 근태가 이상한 직원을 찾아봐요. → https://insacheck.com/docs/mcp/admin.md
- ADM-10 오늘 출근율을 봐요. → https://insacheck.com/docs/mcp/admin.md
- MULTI-13 오늘 할 일을 보고 이번 주 출퇴근을 봐요. → https://insacheck.com/docs/mcp/multi.md
- MULTI-15 출퇴근 기록을 보고 정정 결재를 올려요. → https://insacheck.com/docs/mcp/multi.md
- MULTI-16 오늘 출근 현황과 휴가자를 함께 봐요. → https://insacheck.com/docs/mcp/multi.md
- MULTI-23 근태가 이상한 직원을 찾고 확인 업무를 보내요. → https://insacheck.com/docs/mcp/multi.md

## 안 되는 것 · 대안

아직 AI 로 안 되는 일이에요. 대신 화면에서 해요.

- 직원의 출퇴근 기록을 관리자가 대신 고쳐요. → 기록 → 근무기록 수정 (/worker/attendance-correction)
- 출퇴근을 찍는 방법을 켜고 꺼요. → 설정 → 출근 확인 (/admin/enterprise/attendance-methods)
- 점심 외출과 복귀 시각을 기록해요. → 홈 → 휴식·식사 단추 (/worker/dashboard)
- 사무실 위치와 출근 인정 거리를 등록해요. → 설정 → 일하는 곳 (/admin/enterprise/hr/office-location)
- 오늘 늦게 온 사람을 봐요. → 관리 → 출퇴근현황 (/worker/team)
- 올라온 외근 신청을 승인해요. → 결재/요청 → 결재요청 내역 → 결재함 (/worker/requests)
- 올라온 연장근무 신청을 승인해요. → 결재/요청 → 결재요청 내역 → 결재함 (/worker/requests)
