OpenClaw Microsoft Teams 채널
Azure Bot 리소스를 통해 Bot Framework를 사용하여 OpenClaw를 Microsoft Teams에 연결합니다. 이 플러그인 기반 통합을 통해 AI 어시스턴트가 Teams에서 작동할 수 있으며, 개인 DM, 그룹 채팅 및 채널 대화를 처리합니다. OpenClaw는 /api/messages에서 Bot Framework의 webhook 이벤트를 수신하고 Teams 메시징 API를 통해 응답하며, 스레드 답변, Adaptive Cards, 리액션, SharePoint를 통한 파일 공유, 팀/채널별 구성 재정의를 지원합니다.
Microsoft Teams 지원 기능
텍스트 메시지
지원
미디어 및 파일
지원
리액션
지원
스레드
지원
음성 메시지
미지원
그룹 채팅
지원
Microsoft Teams 사전 요구사항
- Azure Bot 리소스를 생성할 수 있는 권한이 있는 Azure 계정
- App ID, App Password(클라이언트 시크릿) 및 Tenant ID가 등록된 Azure Bot(단일 테넌트 권장)
- 봇 구성, 범위 및 아이콘(outline.png 32×32, color.png 192×192)이 포함된 Teams App Manifest(manifest.json)
- 공개 HTTPS URL 또는 터널을 통해 접근 가능한 OpenClaw Gateway 실행 중(기본 webhook 포트 3978)
- Teams 플러그인 설치: openclaw plugins install @openclaw/msteams
Microsoft Teams 빠른 설정
Azure Bot 리소스 생성
Azure Portal → 리소스 만들기 → 'Azure Bot' 검색으로 이동합니다. Single Tenant 유형으로 생성합니다. App Registration에서 클라이언트 시크릿을 생성합니다. App ID, 클라이언트 시크릿, Tenant ID를 복사합니다. OpenClaw 구성에 세 가지 모두 필요합니다.
Teams 플러그인 설치 및 구성
'openclaw plugins install @openclaw/msteams'를 실행하여 플러그인을 설치합니다. openclaw.json에 appId, appPassword, tenantId를 포함한 Teams 채널 구성을 추가합니다. 환경 변수 MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD, MSTEAMS_TENANT_ID를 사용할 수도 있습니다.
메시징 엔드포인트 설정 및 Teams 채널 활성화
Azure Portal에서 Bot 리소스 → 구성으로 이동합니다. 메시징 엔드포인트를 'https://<your-domain>/api/messages'로 설정합니다. 그런 다음 채널 → Microsoft Teams 추가 → 구성으로 이동합니다. 로컬 개발의 경우 터널(ngrok 또는 Tailscale Funnel)을 사용하여 포트 3978을 노출합니다.
Teams 앱 생성 및 설치
봇의 App ID를 botId로, 범위(personal, team, groupChat) 및 RSC 권한이 포함된 manifest.json을 생성합니다. outline.png와 color.png와 함께 zip으로 압축합니다. Teams Developer Portal 또는 Teams Admin Center를 통해 업로드합니다. 테스트용으로는 앱 패키지를 사이드로드합니다.
봇 테스트
Teams에서 봇을 찾아 다이렉트 메시지를 보냅니다. 기본 페어링 정책을 사용하는 경우, 터미널에서 'openclaw pairing approve msteams <code>'로 발신자를 승인합니다. 봇이 AI 생성 응답으로 답변해야 합니다.
Microsoft Teams 구성 예시
{
"channels": {
"msteams": {
"enabled": true,
"appId": "YOUR_APP_ID",
"appPassword": "YOUR_APP_PASSWORD",
"tenantId": "YOUR_TENANT_ID",
"webhook": {
"port": 3978,
"path": "/api/messages"
}
}
}
}Microsoft Teams 상세 문서
아키텍처 개요
Azure Bot 설정 및 앱 등록
{
"channels": {
"msteams": {
"appId": "<APP_ID>",
"appPassword": "<APP_PASSWORD>",
"tenantId": "<TENANT_ID>"
}
}
}Teams App Manifest 및 RSC 권한
DM 정책
{
"channels": {
"msteams": {
"dmPolicy": "allowlist",
"allowFrom": [
"user@org.com",
"40a1a0ed-4ff2-4164-a219-55518990c197"
]
}
}
}그룹 채팅 및 채널 관리
{
"channels": {
"msteams": {
"groupPolicy": "allowlist",
"groupAllowFrom": ["user@org.com"],
"teams": {
"My Team": {
"channels": {
"General": {
"requireMention": true
}
}
}
}
}
}
}응답 스타일 및 스레딩
{
"channels": {
"msteams": {
"replyStyle": "thread",
"teams": {
"19:abc...@thread.tacv2": {
"channels": {
"19:xyz...@thread.tacv2": {
"replyStyle": "top-level"
}
}
}
}
}
}
}파일 처리 및 SharePoint
{
"channels": {
"msteams": {
"sharePointSiteId": "YOUR_SHAREPOINT_SITE_ID",
"mediaAllowHosts": ["*.microsoft.com", "*.sharepoint.com"],
"mediaAuthAllowHosts": ["graph.microsoft.com"]
}
}
}Adaptive Cards 및 설문
Teams ID 추출
Microsoft Teams 구성 참조
| Key | Type | Default | Description |
|---|---|---|---|
| enabled | boolean | true | Microsoft Teams 채널 활성화 또는 비활성화 |
| appId | string | "" | Azure Bot App ID(Microsoft App ID). 환경 변수 MSTEAMS_APP_ID도 사용 가능 |
| appPassword | string | "" | Azure Bot 클라이언트 시크릿. 환경 변수 MSTEAMS_APP_PASSWORD도 사용 가능 |
| tenantId | string | "" | 단일 테넌트 인증을 위한 Azure AD Tenant ID. 환경 변수 MSTEAMS_TENANT_ID도 사용 가능 |
| webhook.port | number | 3978 | Bot Framework 이벤트를 수신하는 webhook 리스너 포트 |
| webhook.path | string | "/api/messages" | 수신 Bot Framework 메시지를 위한 webhook 엔드포인트 경로 |
| dmPolicy | string | "pairing" | 봇에 DM을 보낼 수 있는 사용자를 제어합니다. 옵션: pairing, allowlist, open, disabled |
| allowFrom | string[] | [] | 봇에 DM을 보낼 수 있는 AAD 객체 ID, UPN 또는 표시 이름(dmPolicy가 allowlist일 때) |
| groupPolicy | string | "allowlist" | 그룹/채널 접근 제어. 옵션: allowlist, open, disabled |
| groupAllowFrom | string[] | [] | 그룹 채팅에서 허용되는 발신자. 설정되지 않으면 allowFrom으로 대체 |
| teams | object | {} | 팀별 및 채널별 구성 재정의(replyStyle, requireMention, tools) |
| requireMention | boolean | true | 채널 및 그룹 채팅에서 @멘션 필요. RSC 권한과 함께 false로 설정하면 모든 메시지에 응답 |
| replyStyle | string | "thread" | 응답 레이아웃 스타일. 옵션: thread(클래식 Posts), top-level(Slack 스타일 Threads) |
| configWrites | boolean | true | 런타임에 /config set|unset 명령으로 채널 설정 수정 허용 |
| textChunkLimit | number | — | 청킹 전 발신 메시지당 최대 문자 수 |
| chunkMode | string | "length" | 텍스트 청킹 전략. 옵션: length(하드 분할), newline(단락 인식) |
| sharePointSiteId | string | "" | 그룹 채팅/채널 파일 업로드를 위한 SharePoint 사이트 ID |
| mediaAllowHosts | string[] | MS/Teams domains | 미디어 첨부 파일 다운로드가 허용된 호스트 |
| mediaAuthAllowHosts | string[] | Graph + Bot Framework | 미디어 다운로드 시 Authorization 헤더를 수신하는 호스트 |
| dmHistoryLimit | number | 50 | 대화당 AI 컨텍스트에 포함되는 최근 DM 메시지 수 |
| historyLimit | number | 50 | AI 컨텍스트에 포함되는 최대 채널/그룹 메시지 수 |
Microsoft Teams 채널 활성화 또는 비활성화
Azure Bot App ID(Microsoft App ID). 환경 변수 MSTEAMS_APP_ID도 사용 가능
Azure Bot 클라이언트 시크릿. 환경 변수 MSTEAMS_APP_PASSWORD도 사용 가능
단일 테넌트 인증을 위한 Azure AD Tenant ID. 환경 변수 MSTEAMS_TENANT_ID도 사용 가능
Bot Framework 이벤트를 수신하는 webhook 리스너 포트
수신 Bot Framework 메시지를 위한 webhook 엔드포인트 경로
봇에 DM을 보낼 수 있는 사용자를 제어합니다. 옵션: pairing, allowlist, open, disabled
봇에 DM을 보낼 수 있는 AAD 객체 ID, UPN 또는 표시 이름(dmPolicy가 allowlist일 때)
그룹/채널 접근 제어. 옵션: allowlist, open, disabled
그룹 채팅에서 허용되는 발신자. 설정되지 않으면 allowFrom으로 대체
팀별 및 채널별 구성 재정의(replyStyle, requireMention, tools)
채널 및 그룹 채팅에서 @멘션 필요. RSC 권한과 함께 false로 설정하면 모든 메시지에 응답
응답 레이아웃 스타일. 옵션: thread(클래식 Posts), top-level(Slack 스타일 Threads)
런타임에 /config set|unset 명령으로 채널 설정 수정 허용
청킹 전 발신 메시지당 최대 문자 수
텍스트 청킹 전략. 옵션: length(하드 분할), newline(단락 인식)
그룹 채팅/채널 파일 업로드를 위한 SharePoint 사이트 ID
미디어 첨부 파일 다운로드가 허용된 호스트
미디어 다운로드 시 Authorization 헤더를 수신하는 호스트
대화당 AI 컨텍스트에 포함되는 최근 DM 메시지 수
AI 컨텍스트에 포함되는 최대 채널/그룹 메시지 수
Microsoft Teams 자주 묻는 질문
Microsoft Teams 문제 해결
Graph API 권한이 부여되지 않았거나 관리자 동의가 누락되었습니다. 봇이 실제 파일 대신 콘텐츠 스텁을 수신합니다.
봇은 기본적으로 채널 및 그룹 채팅에서 @멘션을 필요로 하거나 RSC 권한이 구성되지 않았습니다.
Teams가 앱 메타데이터를 적극적으로 캐시합니다. 이전 매니페스트가 여전히 사용 중입니다.
OpenClaw 구성의 appId, appPassword 또는 tenantId가 Azure Bot 등록과 일치하지 않거나, 적절한 Azure JWT 토큰 없이 수동으로 테스트하고 있습니다.
Microsoft Teams는 과거에 비공개 채널에서 봇 지원이 제한적이었습니다. 2026년 초부터 Microsoft는 비공개 채널에 대한 전체 앱 지원을 배포하고 있지만 아직 모든 테넌트에서 사용할 수 없을 수 있습니다.