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

# 여러 단계 (multi)

한 번 말하면 여러 도구를 이어 부르는 일.

## 할 수 있는 일

- 도구 0개 · 흐름 21개 (AI 로 끝까지 20개 · 화면 안내 1개)
- MULTI-01 내가 누구인지 보고 오늘 할 일을 봐요.
- MULTI-02 필요한 도구를 찾고 남은 연차를 읽어요.
- MULTI-03 휴가 신청 기능을 찾고 반차를 올려요.
- MULTI-04 직원을 찾고 그 사람 정보를 봐요.
- MULTI-05 직원을 찾고 그 사람의 남은 연차를 봐요.
- MULTI-06 남은 연차를 보고 확인한 뒤 휴가를 올려요.
- MULTI-07 업무를 보내고 댓글을 달아 확인해요.
- MULTI-08 올린 결재가 지금 어디까지 갔는지 봐요.
- MULTI-09 일하는 곳 번호를 찾아 반경을 바꿔요.
- MULTI-10 회사 정보를 보고 전화번호를 바꿔요.
- MULTI-11 휴가 규칙을 보고 신청 기한을 바꿔요.
- MULTI-12 내 역할을 보고 맞는 안내서를 읽어요.
- MULTI-13 오늘 할 일을 보고 이번 주 출퇴근을 봐요.
- MULTI-14 휴가를 올리고 바로 취소해요.
- MULTI-15 출퇴근 기록을 보고 정정 결재를 올려요.
- MULTI-16 오늘 출근 현황과 휴가자를 함께 봐요.
- MULTI-18 남은 연차와 쓴 내역을 같이 봐요.
- MULTI-21 경비를 올리고 처리 상태를 바로 봐요.
- MULTI-22 내 근무 일정을 보고 근무 교환을 신청해요.
- MULTI-23 근태가 이상한 직원을 찾고 확인 업무를 보내요.

## 도구

이 영역에는 따로 부르는 도구가 없어요. 다른 영역의 도구를 이어 불러요(아래 흐름).

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

### MULTI-01 내가 누구인지 보고 오늘 할 일을 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「나 누구로 로그인돼 있어? 그리고 오늘 할 일 알려줘」 「내 권한이랑 오늘 볼 것 같이 보여줘」 「아침 점검해 줘」

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

```text
  1. tools/call {"name":"whoami","arguments":{}}
     서버: 몸통 src/routes/mcp-tools/base-whoami.ts:whoami
     다음으로 넘길 값: 이름 · 역할
  2. tools/call {"name":"today","arguments":{"kind":"all"}}
     서버: 몸통 src/routes/mcp-tools/today-core.ts:today
     다음으로 넘길 값: 오늘 볼 것
```

- 필요한 값 · 되묻기: 따로 필요한 값은 없어요.
- 끝: 내 이름과 역할, 오늘 볼 업무·결재·알림을 보여 줘요.
- 화면: 홈 (/worker)
- 하면 안 되는 것: 다른 사람의 오늘 할 일은 보지 않아요.

### MULTI-02 필요한 도구를 찾고 남은 연차를 읽어요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「남은 연차 볼 수 있는 기능 찾아서 알려줘」 「내 연차 며칠인지 찾아봐 줘」 「연차 확인하는 방법으로 바로 봐줘」

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

```text
  1. tools/call {"name":"find_tools","arguments":{"query":"남은 연차","kind":"read","limit":3}}
     서버: 몸통 src/routes/mcp-base-run.ts:findTools
     다음으로 넘길 값: 도구 이름
  2. tools/call {"name":"run_read","arguments":{"tool":"query_my_leave_balance","args":{"year":2026}}}
     서버: 몸통 src/routes/mcp-tools/leave.ts:query_my_leave_balance
     다음으로 넘길 값: 남은 일수
```

- 필요한 값 · 되묻기: 연도 말이 없으면 올해예요.
- 끝: 찾은 도구로 올해 남은 연차를 보여 줘요.
- 화면: 휴가 → 내 연차 (/worker/leave)
- 하면 안 되는 것: 다른 사람 연차는 이 흐름으로 보지 않아요.

### MULTI-03 휴가 신청 기능을 찾고 반차를 올려요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「반차 신청하는 기능 찾아서 내일 오전 반차 올려줘」 「오전 반차 쓰고 싶어요」 「다음 주 화요일 오전 반차 신청해줘」

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

```text
  1. tools/call {"name":"find_tools","arguments":{"query":"휴가 신청","kind":"write","limit":3}}
     서버: 몸통 src/routes/mcp-base-run.ts:findTools
     다음으로 넘길 값: 도구 이름
  (값이 없으면 먼저 물어요: 「며칠에 반차를 쓸까요?」)
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"request_leave","args":{"start_date":"2026-10-27","leave_type":"half_morning","reason":"개인 일정"}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:request_leave
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"request_leave","args":{"start_date":"2026-10-27","leave_type":"half_morning","reason":"개인 일정"},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tool-handlers.ts:request_leave
```

- 필요한 값 · 되묻기: 날짜 / 오전 또는 오후
- 끝: 반차 신청이 올라가요.
- 화면: 휴가 → 휴가 신청 (/worker/leave)
- 하면 안 되는 것: 결재 없이 바로 확정하지 않아요. / 미리보기를 보고 확인한 뒤에 올려요.

### MULTI-04 직원을 찾고 그 사람 정보를 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「김가상 정보 알려줘」 「김가상 입사일이랑 부서 알려줘」 「김가상 직책이 뭐였지?」

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

```text
  1. tools/call {"name":"search","arguments":{"query":"김가상","kind":"people"}}
     서버: 몸통 src/routes/mcp-tools/base-search.ts:search
     다음으로 넘길 값: 사람 번호
     그다음: 후보가 여럿이면(needs_choice) 「같은 이름이 여럿이에요. 누구예요?」 → 고른 id 로 같은 줄을 다시
  2. tools/call {"name":"run_read","arguments":{"tool":"query_employee_profile","args":{}}}
     넘겨받는 값: 1.items.0.id → worker
     서버: 몸통 src/routes/mcp-tools/org-payroll.ts:query_employee_profile
```

- 필요한 값 · 되묻기: 찾을 사람 이름
- 끝: 찾은 사람의 부서, 직책, 입사일을 보여 줘요.
- 화면: 조직 → 직원 (/admin/enterprise/employees)
- 하면 안 되는 것: 급여는 이 흐름으로 보여 주지 않아요. / 내 범위 밖 사람은 볼 수 없어요.

### MULTI-05 직원을 찾고 그 사람의 남은 연차를 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「이가상 연차 며칠 남았어?」 「이가상 휴가 잔여 알려줘」 「이가상이 연차 얼마나 썼는지 봐줘」

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

```text
  1. tools/call {"name":"search","arguments":{"query":"이가상","kind":"people"}}
     서버: 몸통 src/routes/mcp-tools/base-search.ts:search
     다음으로 넘길 값: 사람 번호
     그다음: 후보가 여럿이면(needs_choice) 「같은 이름이 여럿이에요. 누구예요?」 → 고른 id 로 같은 줄을 다시
  2. tools/call {"name":"run_read","arguments":{"tool":"query_leave_balance","args":{"year":2026}}}
     넘겨받는 값: 1.items.0.id → worker
     서버: 몸통 src/routes/mcp-tools/leave.ts:query_leave_balance
     다음으로 넘길 값: 남은 일수
```

- 필요한 값 · 되묻기: 찾을 사람 이름
- 끝: 찾은 사람의 올해 남은 연차를 보여 줘요.
- 화면: 휴가 → 직원 휴가 (/admin/enterprise/hr/leave-ledger)
- 하면 안 되는 것: 내 범위 밖 사람의 연차는 볼 수 없어요.

### MULTI-06 남은 연차를 보고 확인한 뒤 휴가를 올려요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「연차 남았는지 보고 월요일 휴가 올려줘」 「내일 연차 신청해줘, 남았는지도 봐줘」 「다음 주 월요일에 쉬고 싶어요」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_leave_balance","args":{"year":2026}}}
     서버: 몸통 src/routes/mcp-tools/leave.ts:query_my_leave_balance
     다음으로 넘길 값: 남은 일수
  2. tools/call {"name":"run_read","arguments":{"tool":"approval_preview","args":{"type":"leave"}}}
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:engineLine
     다음으로 넘길 값: 결재자 이름
  (값이 없으면 먼저 물어요: 「며칠에 쉴까요?」)
  3-미리보기. tools/call {"name":"approval_request","arguments":{"type":"leave","start_date":"2026-10-26","reason":"개인 사정"}}
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「결재를 누구에게 올릴까요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  3-확정. tools/call {"name":"approval_request","arguments":{"type":"leave","start_date":"2026-10-26","reason":"개인 사정","confirmation_id":"<3-미리보기.confirmation_id>"}}
     넘겨받는 값: 3-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan
     다음으로 넘길 값: 결재 번호
```

- 필요한 값 · 되묻기: 휴가 날짜 / 사유
- 끝: 결재가 올라가고 결재자 이름을 알려 줘요.
- 화면: 휴가 → 휴가 신청 (/worker/leave)
- 하면 안 되는 것: 남은 연차가 모자라면 올리지 않아요. / 결재자를 마음대로 고르지 않아요.

### MULTI-07 업무를 보내고 댓글을 달아 확인해요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「이가상에게 정산 자료 확인 업무 보내고 댓글도 달아줘」 「업무 하나 만들어서 안내 댓글 남겨줘」 「업무 보내고 잘 갔는지 봐줘」

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

```text
  (값이 없으면 먼저 물어요: 「누구에게 언제까지 시킬까요?」)
  1-미리보기. tools/call {"name":"task_create","arguments":{"title":"10월 정산 자료 확인","to":["이가상"],"due":"2026-10-28"}}
     서버: 몸통 src/routes/mcp-tools/work-tasks.ts:task_create
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「같은 이름이 여럿이에요. 누구예요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"task_create","arguments":{"title":"10월 정산 자료 확인","to":["이가상"],"due":"2026-10-28","confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/work-tasks.ts:task_create
     다음으로 넘길 값: 업무 번호
  2-미리보기. tools/call {"name":"task_comment","arguments":{"body":"금요일까지 올려 주세요."}}
     넘겨받는 값: 1.id → id
     서버: 몸통 src/routes/mcp-tools/work-tasks.ts:task_comment
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"task_comment","arguments":{"body":"금요일까지 올려 주세요.","confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 1.id → id · 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/work-tasks.ts:task_comment
  3. tools/call {"name":"task_get","arguments":{}}
     넘겨받는 값: 1.id → id
     서버: 몸통 src/routes/mcp-tools/work-tasks.ts:task_get
     다음으로 넘길 값: 기한 · 댓글 수
```

- 필요한 값 · 되묻기: 받는 사람 / 기한 / 댓글 내용
- 끝: 업무가 가고 댓글이 달리고 내용을 다시 보여 줘요.
- 화면: 업무 → 내 할 일 (/worker/calendar)
- 하면 안 되는 것: 받는 사람을 마음대로 고르지 않아요. / 보낸 업무를 되돌리지는 않아요.

### MULTI-08 올린 결재가 지금 어디까지 갔는지 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「방금 올린 휴가 결재 어디까지 갔어?」 「내가 올린 결재 상태 알려줘」 「결재 누가 아직 안 했는지 봐줘」

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

```text
  (값이 없으면 먼저 물어요: 「며칠에 쉴까요?」)
  1-미리보기. tools/call {"name":"approval_request","arguments":{"type":"leave","start_date":"2026-10-29","reason":"병원 진료"}}
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「결재를 누구에게 올릴까요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"approval_request","arguments":{"type":"leave","start_date":"2026-10-29","reason":"병원 진료","confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan
     다음으로 넘길 값: 결재 번호
  2. tools/call {"name":"approval_list","arguments":{"box":"mine"}}
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalList
     다음으로 넘길 값: 결재 번호 · 종류
  3. tools/call {"name":"run_read","arguments":{"tool":"approval_get","args":{}}}
     넘겨받는 값: 2.items.0.id → id · 2.items.0.type → type
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalGet
     다음으로 넘길 값: 진행 상태 · 결재선
```

- 필요한 값 · 되묻기: 올릴 휴가 날짜 / 사유
- 끝: 올린 결재의 진행 상태와 결재선을 보여 줘요.
- 화면: 결재 → 내가 올린 결재 (/worker/approvals)
- 하면 안 되는 것: 남의 결재는 볼 수 없어요. / 결재를 대신 승인하지 않아요.

### MULTI-09 일하는 곳 번호를 찾아 반경을 바꿔요.
- 누가: 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「본사 반경 150m 로 바꿔줘」 「일하는 곳 목록 보고 첫 번째 반경 넓혀줘」 「사무실 반경 수정해줘」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_worksites","args":{}}}
     서버: 몸통 src/routes/mcp-tools/orgmodel.ts:query_worksites
     다음으로 넘길 값: 일하는 곳 번호
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"update_worksite","args":{"radius_m":150}}}
     넘겨받는 값: 1.worksites.0.worksite_id → worksite
     서버: 몸통 src/routes/mcp-tools/orgmodel.ts:update_worksite
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「어느 일하는 곳이에요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"update_worksite","args":{"radius_m":150},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 1.worksites.0.worksite_id → worksite · 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/orgmodel.ts:update_worksite
```

- 필요한 값 · 되묻기: 바꿀 일하는 곳 / 새 반경
- 끝: 고른 일하는 곳의 반경이 바뀌어요.
- 화면: 설정 → 우리 회사 → 일하는 곳 (/admin/enterprise/hr/office-location)
- 하면 안 되는 것: 지워지는 곳은 없어요.

### MULTI-10 회사 정보를 보고 전화번호를 바꿔요.
- 누가: 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「회사 전화번호 확인하고 바꿔줘」 「지금 등록된 대표 번호 보고 새 번호로 고쳐줘」 「회사 연락처 확인 후 수정」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_company_info","args":{}}}
     서버: 몸통 src/routes/mcp-tools/enterprise-settings.ts:query_company_info
     다음으로 넘길 값: 지금 전화번호
  (값이 없으면 먼저 물어요: 「새 전화번호가 뭐예요?」)
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"update_company_info","args":{"phone":"02-1111-0000"}}}
     서버: 몸통 src/routes/mcp-tools/enterprise-settings.ts:update_company_info
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"update_company_info","args":{"phone":"02-1111-0000"},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/enterprise-settings.ts:update_company_info
```

- 필요한 값 · 되묻기: 새 전화번호
- 끝: 지금 번호를 보여 주고 새 번호로 바꿔요.
- 화면: 설정 → 회사 정보 (/admin/enterprise/profile)
- 하면 안 되는 것: 사업자등록증 파일은 바꾸지 않아요.

### MULTI-11 휴가 규칙을 보고 신청 기한을 바꿔요.
- 누가: 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「휴가는 이틀 전까지만 신청받게 해줘」 「지금 휴가 규칙 보고 신청 기한을 바꿔줘」 「휴가 미리 신청하는 일수 정해줘」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_leave_policy","args":{}}}
     서버: 몸통 src/routes/mcp-tools/policies.ts:query_leave_policy
     다음으로 넘길 값: 지금 규칙
  (값이 없으면 먼저 물어요: 「며칠 전까지 신청받을까요?」)
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"update_leave_policy","args":{"min_days_advance":2}}}
     서버: 몸통 src/routes/mcp-tools/enterprise-settings.ts:update_leave_policy
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"update_leave_policy","args":{"min_days_advance":2},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/enterprise-settings.ts:update_leave_policy
```

- 필요한 값 · 되묻기: 며칠 전까지(0~90일)
- 끝: 지금 규칙을 보여 주고 신청 기한을 바꿔요.
- 화면: 설정 → 휴가 → 휴가 규칙 (/admin/enterprise/hr/leave-policy)
- 하면 안 되는 것: 이미 올라온 신청은 바꾸지 않아요.

### MULTI-12 내 역할을 보고 맞는 안내서를 읽어요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「내가 할 수 있는 일이랑 휴가 안내 보여줘」 「내 권한 확인하고 휴가 쪽 설명해줘」 「처음이라 뭘 할 수 있는지 알려줘」

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

```text
  1. tools/call {"name":"whoami","arguments":{}}
     서버: 몸통 src/routes/mcp-tools/base-whoami.ts:whoami
     다음으로 넘길 값: 역할 · 쓸 수 있는 도구 수
  2. tools/call {"name":"guide","arguments":{"topic":"leave"}}
     서버: 몸통 src/routes/mcp-tools/base-guide.ts:guide
     다음으로 넘길 값: 휴가 안내
```

- 필요한 값 · 되묻기: 읽을 장 이름이 없으면 시작 장이에요.
- 끝: 내 역할과 휴가 안내를 보여 줘요.
- 화면: 홈 (/worker)
- 하면 안 되는 것: 권한 밖 기능은 안내하지 않아요.

### MULTI-13 오늘 할 일을 보고 이번 주 출퇴근을 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「오늘 할 일이랑 이번 주 출퇴근 같이 보여줘」 「아침에 볼 것 한 번에 알려줘」 「오늘 뭐 있는지 보고 이번 주 몇 시간 일했는지 알려줘」

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

```text
  1. tools/call {"name":"today","arguments":{"kind":"all"}}
     서버: 몸통 src/routes/mcp-tools/today-core.ts:today
     다음으로 넘길 값: 오늘 볼 것
  2. tools/call {"name":"run_read","arguments":{"tool":"query_my_attendance","args":{"days":7}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:query_my_attendance
     다음으로 넘길 값: 출퇴근 기록
```

- 필요한 값 · 되묻기: 며칠치인지 말이 없으면 7일이에요.
- 끝: 오늘 볼 것과 이번 주 출퇴근 기록을 보여 줘요.
- 화면: 홈 (/worker)
- 하면 안 되는 것: 다른 사람 기록은 보지 않아요.

### MULTI-14 휴가를 올리고 바로 취소해요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「휴가 신청했는데 취소할래」 「방금 올린 연차 취소해줘」 「다음 달 2일 연차 올렸다가 마음이 바뀌었어」

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

```text
  (값이 없으면 먼저 물어요: 「며칠 휴가였나요?」)
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"request_leave","args":{"start_date":"2026-11-02","leave_type":"annual","reason":"개인 일정"}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:request_leave
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"request_leave","args":{"start_date":"2026-11-02","leave_type":"annual","reason":"개인 일정"},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tool-handlers.ts:request_leave
  2. tools/call {"name":"run_read","arguments":{"tool":"query_my_leaves","args":{"status":"pending","year":2026}}}
     서버: 몸통 src/routes/mcp-tools/leave.ts:query_my_leaves
     다음으로 넘길 값: 휴가 번호
  3-미리보기. tools/call {"name":"run_write","arguments":{"tool":"cancel_leave_request","args":{}}}
     넘겨받는 값: 2.leaves.0.leave_id → leave_id
     서버: 몸통 src/routes/mcp-tools/leave.ts:cancel_leave_request
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  3-확정. tools/call {"name":"run_write","arguments":{"tool":"cancel_leave_request","args":{},"confirmation_id":"<3-미리보기.confirmation_id>"}}
     넘겨받는 값: 2.leaves.0.leave_id → leave_id · 3-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/leave.ts:cancel_leave_request
```

- 필요한 값 · 되묻기: 취소할 휴가 날짜
- 끝: 올린 휴가가 취소돼요.
- 화면: 휴가 → 내 휴가 내역 (/worker/leave)
- 하면 안 되는 것: 이미 승인된 휴가는 이 흐름으로 취소하지 않아요.

### MULTI-15 출퇴근 기록을 보고 정정 결재를 올려요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「어제 퇴근 안 찍힌 거 확인하고 정정 올려줘」 「이번 주 출퇴근 보고 틀린 날 정정해줘」 「퇴근 기록 확인하고 수정 요청해줘」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_attendance","args":{"days":7}}}
     서버: 몸통 src/routes/mcp-tool-handlers.ts:query_my_attendance
     다음으로 넘길 값: 빠진 날
  2. tools/call {"name":"run_read","arguments":{"tool":"approval_preview","args":{"type":"attendance_fix"}}}
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:engineLine
     다음으로 넘길 값: 결재자 이름
  (값이 없으면 먼저 물어요: 「며칠 몇 시로 고칠까요?」)
  3-미리보기. tools/call {"name":"approval_request","arguments":{"type":"attendance_fix","day":"2026-10-20","checkout_time":"19:10","reason":"퇴근 시각이 잘못 찍힘"}}
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「결재를 누구에게 올릴까요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  3-확정. tools/call {"name":"approval_request","arguments":{"type":"attendance_fix","day":"2026-10-20","checkout_time":"19:10","reason":"퇴근 시각이 잘못 찍힘","confirmation_id":"<3-미리보기.confirmation_id>"}}
     넘겨받는 값: 3-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/approval-request.ts:buildPlan
     다음으로 넘길 값: 결재 번호
```

- 필요한 값 · 되묻기: 날짜(어제부터 30일 안) / 고칠 시각 / 사유
- 끝: 정정 결재가 올라가요.
- 화면: 근태 정정 신청 (/worker/attendance-correction)
- 하면 안 되는 것: 기록을 지우지 않아요. / 결재자를 마음대로 고르지 않아요.

### MULTI-16 오늘 출근 현황과 휴가자를 함께 봐요.
- 누가: 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「오늘 누가 출근했고 누가 쉬는지 알려줘」 「오늘 팀 현황이랑 휴가자 같이 보여줘」 「오늘 자리 비운 사람 정리해줘」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_attendance_today","args":{}}}
     서버: 몸통 src/routes/mcp-legacy-specs.ts:query_attendance_today
     다음으로 넘길 값: 출근한 사람 · 아직 안 온 사람
  2. tools/call {"name":"run_read","arguments":{"tool":"query_leaves_on_date","args":{"date":"2026-10-21"}}}
     서버: 몸통 src/routes/mcp-tools/leave.ts:query_leaves_on_date
     다음으로 넘길 값: 휴가 쓴 사람
```

- 필요한 값 · 되묻기: 날짜가 없으면 오늘이에요.
- 끝: 오늘 출근 현황과 휴가자를 함께 보여 줘요.
- 화면: 근태 → 오늘 출근 현황 (/admin/enterprise/attendance)
- 하면 안 되는 것: 내 범위 밖 사람은 보지 않아요.

### MULTI-17 내가 결재할 건을 보고 화면에서 승인해요.
- 누가: 팀장 · 관리자 · 대표
- 방식: 아직 AI 로 안 돼요 · 대신 화면
- 이렇게 말해요: 「결재할 거 있어?」 「내가 승인할 결재 보여줘」 「결재 대기 건 확인하고 승인할래」

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

```text
  1. tools/call {"name":"approval_list","arguments":{"box":"inbox"}}
     서버: 몸통 src/routes/mcp-tools/approval-read.ts:approvalList
     다음으로 넘길 값: 결재 번호 · 종류 · 올린 사람
```

- 필요한 값 · 되묻기: 아직 AI 로 안 돼요 · 대신 화면에서 해요. / 목록은 AI 로 볼 수 있어요.
- 끝: 결재할 건을 보여 주고 승인은 화면에서 해요.
- 화면: 결재 → 결재함 (/worker/approvals)
- 하면 안 되는 것: 승인과 반려는 이 흐름으로 하지 않아요.

### MULTI-18 남은 연차와 쓴 내역을 같이 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「연차 얼마 남았고 언제 썼는지 알려줘」 「올해 휴가 내역이랑 잔여 같이 보여줘」 「내 연차 현황 정리해줘」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_leave_balance","args":{"year":2026}}}
     서버: 몸통 src/routes/mcp-tools/leave.ts:query_my_leave_balance
     다음으로 넘길 값: 남은 일수
  2. tools/call {"name":"run_read","arguments":{"tool":"query_my_leaves","args":{"year":2026}}}
     서버: 몸통 src/routes/mcp-tools/leave.ts:query_my_leaves
     다음으로 넘길 값: 쓴 날짜 · 상태
```

- 필요한 값 · 되묻기: 연도 말이 없으면 올해예요.
- 끝: 남은 일수와 올해 쓴 휴가 내역을 보여 줘요.
- 화면: 휴가 → 내 연차 (/worker/leave)
- 하면 안 되는 것: 다른 사람 연차는 보지 않아요.

### MULTI-21 경비를 올리고 처리 상태를 바로 봐요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「어제 점심 1만 2천원 경비 올리고 상태 봐줘」 「경비 청구하고 어디까지 갔는지 알려줘」 「식대 경비 올린 다음 내 경비 목록 보여줘」

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

```text
  (값이 없으면 먼저 물어요: 「금액과 쓴 곳을 알려 주세요.」)
  1-미리보기. tools/call {"name":"run_write","arguments":{"tool":"submit_expense","args":{"title":"10월 팀 점심","items":[{"amount":12000,"date":"2026-10-20","vendor":"가상식당","description":"팀 점심","category":"식대"}]}}}
     서버: 몸통 src/routes/mcp-tools/expense.ts:submitMcpExpense · 함수 src/lib/approval-expense-route.ts:createExpenseClaimWithAtomicApproval · 웹 API POST /api/worker/expense {amount, expense_date, description, payment_method, vendor}
     다음으로 넘길 값: confirmation_id
     그다음: 미리보기를 사용자에게 보여 주고 「네」를 받아요
  1-확정. tools/call {"name":"run_write","arguments":{"tool":"submit_expense","args":{"title":"10월 팀 점심","items":[{"amount":12000,"date":"2026-10-20","vendor":"가상식당","description":"팀 점심","category":"식대"}]},"confirmation_id":"<1-미리보기.confirmation_id>"}}
     넘겨받는 값: 1-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/expense.ts:submitMcpExpense · 함수 src/lib/approval-expense-route.ts:createExpenseClaimWithAtomicApproval · 웹 API POST /api/worker/expense {amount, expense_date, description, payment_method, vendor}
     다음으로 넘길 값: 경비 번호
  2. tools/call {"name":"run_read","arguments":{"tool":"query_my_expenses","args":{"month":"2026-10"}}}
     서버: 몸통 src/routes/mcp-tools/expense.ts:query_my_expenses · 웹 API GET /api/worker/expense
     다음으로 넘길 값: 경비 상태
```

- 필요한 값 · 되묻기: 금액은 꼭 필요해요. / 날짜가 없으면 오늘로 올려요. / 쓴 곳과 내용이 있으면 함께 말해요.
- 끝: 경비가 올라가고 내 경비 처리 상태를 보여 줘요.
- 화면: 요청 → 신규 신청 → 경비처리 (/worker/expense)
- 하면 안 되는 것: 확인 없이 경비를 올리지 않아요. / 경비를 승인하는 일은 하지 않아요.

### MULTI-22 내 근무 일정을 보고 근무 교환을 신청해요.
- 누가: 직원 · 팀장 · 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「내 근무 일정 보고 한신입이랑 교환 신청해줘」 「다음 주 내 근무 보고 근무 바꾸자고 해줘」 「일정 확인하고 교대 바꿔달라고 신청해줘」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_my_schedule","args":{"from_date":"2026-10-21","days":14}}}
     서버: 몸통 src/routes/mcp-tools/ops.ts:query_my_schedule · 웹 API GET /api/workers/me/shifts
     다음으로 넘길 값: 내 근무일
  (값이 없으면 먼저 물어요: 「어느 날을 누구와 바꿀까요?」)
  2-미리보기. tools/call {"name":"run_write","arguments":{"tool":"request_shift_swap","args":{"my_date":"2026-10-28","target_worker":"한신입","target_date":"2026-10-30","reason":"개인 일정이 있어요."}}}
     서버: 몸통 src/routes/mcp-tools/shift-ops.ts:request_shift_swap · 함수 src/lib/shift-swap-roster.ts:createShiftSwapRequest · 웹 API POST /api/worker/shift-swap {my_date, target_worker_id, target_date, reason}
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「같은 이름이 여럿이에요. 누구인가요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"run_write","arguments":{"tool":"request_shift_swap","args":{"my_date":"2026-10-28","target_worker":"한신입","target_date":"2026-10-30","reason":"개인 일정이 있어요."},"confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/shift-ops.ts:request_shift_swap · 함수 src/lib/shift-swap-roster.ts:createShiftSwapRequest · 웹 API POST /api/worker/shift-swap {my_date, target_worker_id, target_date, reason}
     다음으로 넘길 값: 교환 신청 번호
```

- 필요한 값 · 되묻기: 내 근무일 · 상대 이름 · 상대 근무일을 말해요. / 같은 부서 직원끼리만 바꿀 수 있어요. / 상대가 수락한 뒤 팀장이 승인해요.
- 끝: 내 일정을 보여 주고 교환 신청이 올라가요.
- 화면: 교대 교환 (/worker/shift-swap)
- 하면 안 되는 것: 확인 없이 신청하지 않아요. / 교환을 대신 승인하지 않아요.

### MULTI-23 근태가 이상한 직원을 찾고 확인 업무를 보내요.
- 누가: 관리자 · 대표
- 방식: AI 로 끝까지 돼요
- 이렇게 말해요: 「근태 이상한 사람 찾고 확인해 달라고 업무 보내줘」 「이상 기록 보고 해당 직원에게 확인 요청해줘」 「출퇴근 이상한 직원한테 업무로 물어봐줘」

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

```text
  1. tools/call {"name":"run_read","arguments":{"tool":"query_attendance_anomaly","args":{"limit":10}}}
     서버: 몸통 src/routes/mcp-tools/insights.ts:query_attendance_anomaly
     다음으로 넘길 값: 직원 이름 · 이상한 기록
  (값이 없으면 먼저 물어요: 「누구에게 확인을 부탁할까요?」)
  2-미리보기. tools/call {"name":"task_create","arguments":{"title":"출퇴근 기록 확인","body":"어제 출퇴근 기록이 이상해요. 확인해 주세요.","to":["김가상"],"due":"2026-10-23"}}
     서버: 몸통 src/routes/mcp-tools/work-tasks.ts:task_create
     다음으로 넘길 값: confirmation_id
     그다음: 후보가 여럿이면(needs_choice) 「같은 이름이 여럿이에요. 누구에게 보낼까요?」 → 고른 id 로 같은 줄을 다시 · 미리보기를 사용자에게 보여 주고 「네」를 받아요
  2-확정. tools/call {"name":"task_create","arguments":{"title":"출퇴근 기록 확인","body":"어제 출퇴근 기록이 이상해요. 확인해 주세요.","to":["김가상"],"due":"2026-10-23","confirmation_id":"<2-미리보기.confirmation_id>"}}
     넘겨받는 값: 2-미리보기.confirmation_id → confirmation_id
     서버: 몸통 src/routes/mcp-tools/work-tasks.ts:task_create
     다음으로 넘길 값: 업무 번호
```

- 필요한 값 · 되묻기: 확인을 부탁할 직원 이름 / 마감 날짜
- 끝: 이상 기록을 보여 주고 확인 업무가 가요.
- 화면: 업무 → ＋ 업무 요청 (/worker/calendar)
- 하면 안 되는 것: 이상하다는 이유로 기록을 고치지 않아요. / 확인 없이 업무를 보내지 않아요.

## 안 되는 것 · 대안

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

- 내가 결재할 건을 보고 화면에서 승인해요. → 결재 → 결재함 (/worker/approvals)
