Microsoft Teams 채팅을 읽고 메시지를 보낸다. 로그인된 Teams 웹 세션을 재사용하는 로컬 도구로 대화를 증분 수집해 find/recent 로 조회하고, send 로 임의의 방에 실제 발송한다. 읽기 - 놓친 대화 따라잡기, 결정사항·액션아이템 추출, 주제·키워드 추적, 누가 무슨 말 했는지 확인. 쓰기 - 특정 인물·방으로 메시지 전송, 답장, 공지. 트리거 - "팀즈/Teams 에서 ~", "채팅방에서 ~", "내가 자리 비운 동안 놓친 것", "OO 관련 논의 찾아줘", "누가 그 얘기 했었지", "OO한테 ~라고 보내줘", "팀즈로 메시지 보내", "~라고 답장해줘", /teams.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add gw-space/claude-skillbelt --skill teams --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Teams?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/gw-space-teams)More formats (shields.io, HTML) on the badges page.
---
name: teams
description: Microsoft Teams 채팅을 읽고 메시지를 보낸다. 로그인된 Teams 웹 세션을 재사용하는 로컬 도구로 대화를 증분 수집해 find/recent 로 조회하고, send 로 임의의 방에 실제 발송한다. 읽기 - 놓친 대화 따라잡기, 결정사항·액션아이템 추출, 주제·키워드 추적, 누가 무슨 말 했는지 확인. 쓰기 - 특정 인물·방으로 메시지 전송, 답장, 공지. 트리거 - "팀즈/Teams 에서 ~", "채팅방에서 ~", "내가 자리 비운 동안 놓친 것", "OO 관련 논의 찾아줘", "누가 그 얘기 했었지", "OO한테 ~라고 보내줘", "팀즈로 메시지 보내", "~라고 답장해줘", /teams.
---
# teams
Teams 대화를 근거로 답하고, 사용자가 시키면 메시지를 보낸다.
Graph API 를 쓰지 않는다. 대부분의 조직 테넌트가 사용자 동의(user consent)를 막아
`Chat.Read` 조차 관리자 승인을 요구하기 때문이다. 대신 **이미 로그인된 Teams 웹 세션의
토큰을 재사용**해 채팅 서비스를 직접 호출한다.
```bash
TX="${CLAUDE_PLUGIN_ROOT}/skills/teams/scripts/teams-export.mjs"
```
이하 모든 예시는 `node "$TX" <명령>` 형태다. 데이터(로그인 세션·수집본)는
`~/.teams-export/` 에 저장된다 — 플러그인이 업데이트돼도 남는다.
## 최초 1회 준비
사용자가 아직 안 했다면 이 순서로 안내한다. **`login` 은 내가 대신 못 한다**
(MFA 대화형 인증) — 사용자가 직접 실행해야 한다.
```bash
node "$TX" setup # 데이터 디렉터리 + playwright-core 설치
node "$TX" login # 창이 열리면 회사 계정으로 로그인
```
## 불변 규칙
- **`out/*.json` 을 통째로 Read 하지 말 것.** 방 하나가 수천 건일 수 있어 컨텍스트가
터진다. 반드시 `find` / `recent` / `stats` 로 좁혀서 필요한 대목만 본다.
- **요약은 대화창에만.** 사용자가 "파일로 남겨줘" 라고 할 때만 저장한다.
- **수집 갱신은 묻지 않고 실행.** 단 세션당 1회로 제한한다(절차 1).
- **없는 내용을 지어내지 않는다.** 검색에 없으면 "수집 범위에 없습니다" 라고 말하고
`stats` 의 수집 기간을 근거로 제시한다.
## 절차
### 1. 신선도 확인 → 필요하면 갱신 (세션 첫 Teams 질문에서만)
```bash
node "$TX" stats
```
첫 줄이 `마지막 수집: ... (N분/시간/일 전)`.
| 상태 | 조치 |
|---|---|
| 1시간 이내 | 갱신 없이 바로 조회 |
| 1시간 초과 | `node "$TX" export --all` 실행 후 조회 (묻지 않는다) |
| `없음` | `export --all` 실행. 첫 수집은 오래 걸린다고 미리 알린다 |
증분이라 2회차부터는 금방 끝난다. **같은 세션에서 두 번 이상 돌리지 않는다.**
### 2. 질문 유형에 맞는 조회 (네트워크 없음, 즉시)
| 질문 | 명령 |
|---|---|
| "놓친 것 / 요 며칠 뭐 있었어" | `recent --days 3` |
| "OO 관련 논의 찾아줘" | `find "OO" --context 2` |
| "그 방에서 무슨 얘기" | `find "키워드" --room "방이름"` |
| "누가 언제 그 말 했지" | `find "키워드" --from "이름"` |
| "지난주 ~" | `find "키워드" --since 2026-07-20 --until 2026-07-27` |
출력이 많으면 `--limit`, `--room`, 기간으로 좁힌다. 한 번에 안 잡히면 검색어를 바꿔
두세 번 시도한다(동의어·영문 표기·약어).
### 3. 답변
- **근거를 붙인다**: `[방이름] 2026-07-22 홍길동: "..."` 형식으로 인용.
- **결정사항·액션아이템**은 누가·무엇을·언제까지 형태로. 담당자가 불명확하면
불명확하다고 쓴다(추정 금지).
- **놓친 것 따라잡기**는 방별로 묶고, 사용자 언급·질문·답장 필요한 건을 앞에 둔다.
## 발송
사용자가 "OO한테 ~라고 보내줘" 라고 하면 **내가 직접 보낸다.** 명령어를 알려주고
사용자더러 치라고 하지 않는다 — 그게 이 도구를 만든 이유다.
```bash
node "$TX" send "<방이름|번호|self>" "내용" --yes
```
- 대상은 방 이름 **부분일치**이고 최근순 첫 번째가 선택된다. 번호는 `list` 순서라
바뀔 수 있으니 **이름 매칭을 우선**한다.
- `--yes` 없이 돌리면 미리보기만 된다. 매칭이 불확실하면 먼저 미리보기로 확인한다.
- **먼저 확인할 것**: 대상이 애매하게 매칭될 때, 내용을 내가 작성·의역했을 때,
여러 방에 보낼 때. 사용자가 문구를 그대로 준 경우엔 되묻지 말고 바로 보낸다.
- 보낸 뒤 실제 전송된 대상과 문구를 그대로 보고한다.
- **되돌릴 수 없다** — 삭제해도 수신 알림은 이미 나간다. 잘못 보냈으면 숨기지 말고
즉시 알린다.
발신자 이름은 MSAL 캐시의 본인 UUID → Graph 조회로 자동으로 채워진다. 전송 결과 줄의
`발신자="..."` 로 확인할 수 있고, 조회가 실패해도 전송 자체는 성공한다.
### 알아둘 함정
- **`self` 별칭은 `send` 전용.** `export self` 는 실패한다 — `export "48:notes"` 로 쓸 것.
- **권한**: auto 모드 분류기가 실행을 막을 수 있다. `defaultMode: bypassPermissions`
만으로는 통과하지 못한다. 막히면 사용자에게 권한 프롬프트 승인을 요청하거나,
`~/.claude/settings.json` 의 `permissions.allow` 에 아래를 추가하도록 안내한다:
`Bash(node <플러그인경로>/skills/teams/scripts/teams-export.mjs:*)`
## 실패 대응
| 증상 | 원인·조치 |
|---|---|
| `playwright-core 를 찾을 수 없습니다` | `node "$TX" setup` 미실행 |
| `로그인 세션이 없거나 만료됐습니다` | 사용자에게 `node "$TX" login` 실행 요청. 내가 대신 못 한다 |
| `Teams 로컬 대화 목록이 비어 있습니다` | headless 동기화 실패. `export --all --headed` 로 재시도 |
| `GET 401` | 토큰 문제. 대개 재로그인으로 해결 |
| 로그인 창이 회사 클라우드가 아님 (GCC High/DoD) | `TEAMS_EXPORT_URL=https://teams.microsoft.us/` 를 걸고 `login` 부터 다시. 이후 실행에도 같은 값이 필요하니 셸 프로필에 export |
| 조회는 되는데 원하는 게 없음 | 수집 기간 밖일 수 있음. `stats` 기간을 확인해 알린다 |
## 배경
- 대화 목록은 Teams 의 로컬 IndexedDB(`Teams:conversation-manager`)에서 읽는다.
채팅 서비스의 `/v1/users/ME/conversations` 는 IC3 베어러를 401 로 거부한다.
- 메시지는 `{chatServiceUrl}/v1/users/ME/conversations/{id}/messages` 페이지네이션.
- 나가는 요청은 전부 Microsoft 호스트(`authsvc`, `*.chatsvc`, `graph.microsoft.com`)고
데이터는 로컬 디스크에만 쓰인다.
- 로그인 세션이 `~/.teams-export/profile` 에 남는다. 정리하려면 `node "$TX" wipe`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!