---
read_when:
    - Microsoft Teams kanal özellikleri üzerinde çalışılıyor
summary: Microsoft Teams bot desteği durumu, yetenekleri ve yapılandırması
title: Microsoft Teams
x-i18n:
    generated_at: "2026-04-12T00:18:54Z"
    model: gpt-5.4
    provider: openai
    source_hash: 3e6841a618fb030e4c2029b3652d45dedd516392e2ae17309ff46b93648ffb79
    source_path: channels/msteams.md
    workflow: 15
---

# Microsoft Teams

> "Buraya girenler, tüm umutlarını terk etsin."

Güncellendi: 2026-03-25

Durum: metin + DM ekleri desteklenir; kanal/grup dosya gönderimi için `sharePointSiteId` + Graph izinleri gerekir (bkz. [Grup sohbetlerinde dosya gönderme](#sending-files-in-group-chats)). Anketler Adaptive Cards aracılığıyla gönderilir. Mesaj eylemleri, önce dosya gönderimleri için açık `upload-file` sunar.

## Bundled plugin

Microsoft Teams, güncel OpenClaw sürümlerinde bundled plugin olarak gelir; bu nedenle normal paketli derlemede ayrı bir kurulum gerekmez.

Eski bir derlemeyi veya bundled Teams içermeyen özel bir kurulumu kullanıyorsanız, manuel olarak kurun:

```bash
openclaw plugins install @openclaw/msteams
```

Yerel checkout (bir git deposundan çalıştırırken):

```bash
openclaw plugins install ./path/to/local/msteams-plugin
```

Ayrıntılar: [Plugins](/tr/tools/plugin)

## Hızlı kurulum (başlangıç)

1. Microsoft Teams plugin'inin kullanılabilir olduğundan emin olun.
   - Güncel paketli OpenClaw sürümleri bunu zaten bundled olarak içerir.
   - Eski/özel kurulumlar bunu yukarıdaki komutlarla manuel olarak ekleyebilir.
2. Bir **Azure Bot** oluşturun (App ID + client secret + tenant ID).
3. OpenClaw'ı bu kimlik bilgileriyle yapılandırın.
4. `/api/messages` yolunu (varsayılan olarak 3978 portu) herkese açık bir URL veya tünel üzerinden erişilebilir hale getirin.
5. Teams uygulama paketini yükleyin ve gateway'i başlatın.

En düşük yapılandırma (client secret):

```json5
{
  channels: {
    msteams: {
      enabled: true,
      appId: "<APP_ID>",
      appPassword: "<APP_PASSWORD>",
      tenantId: "<TENANT_ID>",
      webhook: { port: 3978, path: "/api/messages" },
    },
  },
}
```

Üretim dağıtımları için, client secret yerine [federated authentication](#federated-authentication-certificate--managed-identity) (sertifika veya managed identity) kullanmayı değerlendirin.

Not: grup sohbetleri varsayılan olarak engellenir (`channels.msteams.groupPolicy: "allowlist"`). Grup yanıtlarına izin vermek için `channels.msteams.groupAllowFrom` ayarlayın (veya herhangi bir üyeye izin vermek için `groupPolicy: "open"` kullanın; mention geçitlidir).

## Hedefler

- Teams DM'leri, grup sohbetleri veya kanallar aracılığıyla OpenClaw ile konuşmak.
- Yönlendirmeyi deterministik tutmak: yanıtlar her zaman geldikleri kanala geri gider.
- Varsayılan olarak güvenli kanal davranışı kullanmak (aksini yapılandırmadıkça mention gerekir).

## Yapılandırma yazımları

Varsayılan olarak Microsoft Teams'in `/config set|unset` ile tetiklenen yapılandırma güncellemelerini yazmasına izin verilir (`commands.config: true` gerekir).

Şununla devre dışı bırakın:

```json5
{
  channels: { msteams: { configWrites: false } },
}
```

## Erişim denetimi (DM'ler + gruplar)

**DM erişimi**

- Varsayılan: `channels.msteams.dmPolicy = "pairing"`. Bilinmeyen göndericiler onaylanana kadar yok sayılır.
- `channels.msteams.allowFrom` sabit AAD nesne kimlikleri kullanmalıdır.
- UPN'ler/görünen adlar değiştirilebilir; doğrudan eşleştirme varsayılan olarak devre dışıdır ve yalnızca `channels.msteams.dangerouslyAllowNameMatching: true` ile etkinleştirilir.
- Sihirbaz, kimlik bilgileri izin veriyorsa adları Microsoft Graph aracılığıyla kimliklere çözümleyebilir.

**Grup erişimi**

- Varsayılan: `channels.msteams.groupPolicy = "allowlist"` (`groupAllowFrom` eklemediğiniz sürece engellenir). Ayarlanmadığında varsayılanı geçersiz kılmak için `channels.defaults.groupPolicy` kullanın.
- `channels.msteams.groupAllowFrom`, grup sohbetlerinde/kanallarda hangi göndericilerin tetikleyebileceğini denetler (`channels.msteams.allowFrom` değerine geri düşer).
- Herhangi bir üyeye izin vermek için `groupPolicy: "open"` ayarlayın (varsayılan olarak yine mention geçitlidir).
- **Hiç kanal**a izin vermemek için `channels.msteams.groupPolicy: "disabled"` ayarlayın.

Örnek:

```json5
{
  channels: {
    msteams: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["user@org.com"],
    },
  },
}
```

**Teams + kanal izin listesi**

- `channels.msteams.teams` altında teams ve kanalları listeleyerek grup/kanal yanıtlarını kapsam içine alın.
- Anahtarlar sabit team ID'leri ve kanal konuşma ID'lerini kullanmalıdır.
- `groupPolicy="allowlist"` olduğunda ve bir teams izin listesi mevcutsa, yalnızca listelenen teams/kanallar kabul edilir (mention geçitli).
- Yapılandırma sihirbazı `Team/Channel` girdilerini kabul eder ve bunları sizin için kaydeder.
- Başlangıçta OpenClaw, team/kanal ve kullanıcı izin listesi adlarını kimliklere çözümler (Graph izinleri izin verdiğinde)
  ve eşlemeyi günlüğe kaydeder; çözümlenemeyen team/kanal adları yazıldığı gibi korunur ancak varsayılan olarak yönlendirme için yok sayılır; yalnızca `channels.msteams.dangerouslyAllowNameMatching: true` etkinse kullanılır.

Örnek:

```json5
{
  channels: {
    msteams: {
      groupPolicy: "allowlist",
      teams: {
        "My Team": {
          channels: {
            General: { requireMention: true },
          },
        },
      },
    },
  },
}
```

## Nasıl çalışır

1. Microsoft Teams plugin'inin kullanılabilir olduğundan emin olun.
   - Güncel paketli OpenClaw sürümleri bunu zaten bundled olarak içerir.
   - Eski/özel kurulumlar bunu yukarıdaki komutlarla manuel olarak ekleyebilir.
2. Bir **Azure Bot** oluşturun (App ID + secret + tenant ID).
3. Bota başvuran ve aşağıdaki RSC izinlerini içeren bir **Teams uygulama paketi** oluşturun.
4. Teams uygulamasını bir team içine (veya DM'ler için kişisel kapsama) yükleyin/kurun.
5. `~/.openclaw/openclaw.json` içinde (veya env vars ile) `msteams` yapılandırmasını yapın ve gateway'i başlatın.
6. Gateway, varsayılan olarak `/api/messages` üzerinde Bot Framework webhook trafiğini dinler.

## Azure Bot Kurulumu (Ön koşullar)

OpenClaw'ı yapılandırmadan önce bir Azure Bot kaynağı oluşturmanız gerekir.

### 1. Adım: Azure Bot oluşturma

1. [Azure Bot Oluştur](https://portal.azure.com/#create/Microsoft.AzureBot) sayfasına gidin
2. **Basics** sekmesini doldurun:

   | Alan               | Değer                                                    |
   | ------------------ | -------------------------------------------------------- |
   | **Bot handle**     | Bot adınız, ör. `openclaw-msteams` (benzersiz olmalıdır) |
   | **Subscription**   | Azure aboneliğinizi seçin                                |
   | **Resource group** | Yeni oluşturun veya mevcut olanı kullanın                |
   | **Pricing tier**   | Geliştirme/test için **Free**                            |
   | **Type of App**    | **Single Tenant** (önerilir - aşağıdaki nota bakın)      |
   | **Creation type**  | **Create new Microsoft App ID**                          |

> **Kullanımdan kaldırma bildirimi:** Yeni multi-tenant botların oluşturulması 2025-07-31 sonrasında kullanımdan kaldırıldı. Yeni botlar için **Single Tenant** kullanın.

3. **Review + create** → **Create** seçeneğine tıklayın (yaklaşık 1-2 dakika bekleyin)

### 2. Adım: Kimlik bilgilerini alma

1. Azure Bot kaynağınıza gidin → **Configuration**
2. **Microsoft App ID** değerini kopyalayın → bu sizin `appId` değerinizdir
3. **Manage Password** seçeneğine tıklayın → App Registration sayfasına gidin
4. **Certificates & secrets** altında → **New client secret** → **Value** değerini kopyalayın → bu sizin `appPassword` değerinizdir
5. **Overview** sayfasına gidin → **Directory (tenant) ID** değerini kopyalayın → bu sizin `tenantId` değerinizdir

### 3. Adım: Mesajlaşma endpoint'ini yapılandırma

1. Azure Bot → **Configuration**
2. **Messaging endpoint** değerini webhook URL'nize ayarlayın:
   - Üretim: `https://your-domain.com/api/messages`
   - Yerel geliştirme: Bir tünel kullanın (aşağıdaki [Yerel Geliştirme](#local-development-tunneling) bölümüne bakın)

### 4. Adım: Teams kanalını etkinleştirme

1. Azure Bot → **Channels**
2. **Microsoft Teams** → Configure → Save seçeneğine tıklayın
3. Hizmet Şartları'nı kabul edin

## Federated Authentication (Sertifika + Managed Identity)

> 2026.3.24 tarihinde eklendi

Üretim dağıtımları için OpenClaw, client secret'a daha güvenli bir alternatif olarak **federated authentication** desteği sunar. İki yöntem vardır:

### Seçenek A: Sertifika tabanlı kimlik doğrulama

Entra ID uygulama kaydınıza kaydedilmiş bir PEM sertifikası kullanın.

**Kurulum:**

1. Bir sertifika oluşturun veya edinin (özel anahtarlı PEM biçimi).
2. Entra ID → App Registration → **Certificates & secrets** → **Certificates** → genel sertifikayı yükleyin.

**Yapılandırma:**

```json5
{
  channels: {
    msteams: {
      enabled: true,
      appId: "<APP_ID>",
      tenantId: "<TENANT_ID>",
      authType: "federated",
      certificatePath: "/path/to/cert.pem",
      webhook: { port: 3978, path: "/api/messages" },
    },
  },
}
```

**Env vars:**

- `MSTEAMS_AUTH_TYPE=federated`
- `MSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem`

### Seçenek B: Azure Managed Identity

Parolasız kimlik doğrulama için Azure Managed Identity kullanın. Bu, managed identity'nin mevcut olduğu Azure altyapısı (AKS, App Service, Azure VM'ler) üzerindeki dağıtımlar için idealdir.

**Nasıl çalışır:**

1. Bot pod/VM'sinde bir managed identity vardır (sistem atanmış veya kullanıcı atanmış).
2. Bir **federated identity credential**, managed identity'yi Entra ID uygulama kaydına bağlar.
3. Çalışma anında OpenClaw, Azure IMDS endpoint'inden (`169.254.169.254`) token almak için `@azure/identity` kullanır.
4. Token, bot kimlik doğrulaması için Teams SDK'ya aktarılır.

**Ön koşullar:**

- Managed identity etkin Azure altyapısı (AKS workload identity, App Service, VM)
- Entra ID uygulama kaydında oluşturulmuş federated identity credential
- Pod/VM'den IMDS'ye (`169.254.169.254:80`) ağ erişimi

**Yapılandırma (sistem atanmış managed identity):**

```json5
{
  channels: {
    msteams: {
      enabled: true,
      appId: "<APP_ID>",
      tenantId: "<TENANT_ID>",
      authType: "federated",
      useManagedIdentity: true,
      webhook: { port: 3978, path: "/api/messages" },
    },
  },
}
```

**Yapılandırma (kullanıcı atanmış managed identity):**

```json5
{
  channels: {
    msteams: {
      enabled: true,
      appId: "<APP_ID>",
      tenantId: "<TENANT_ID>",
      authType: "federated",
      useManagedIdentity: true,
      managedIdentityClientId: "<MI_CLIENT_ID>",
      webhook: { port: 3978, path: "/api/messages" },
    },
  },
}
```

**Env vars:**

- `MSTEAMS_AUTH_TYPE=federated`
- `MSTEAMS_USE_MANAGED_IDENTITY=true`
- `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>` (yalnızca kullanıcı atanmış için)

### AKS Workload Identity Kurulumu

Workload identity kullanan AKS dağıtımları için:

1. AKS kümenizde **workload identity** özelliğini etkinleştirin.
2. Entra ID uygulama kaydında bir **federated identity credential** oluşturun:

   ```bash
   az ad app federated-credential create --id <APP_OBJECT_ID> --parameters '{
     "name": "my-bot-workload-identity",
     "issuer": "<AKS_OIDC_ISSUER_URL>",
     "subject": "system:serviceaccount:<NAMESPACE>:<SERVICE_ACCOUNT>",
     "audiences": ["api://AzureADTokenExchange"]
   }'
   ```

3. Kubernetes service account'a uygulama client ID'si ile **annotation** ekleyin:

   ```yaml
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     name: my-bot-sa
     annotations:
       azure.workload.identity/client-id: "<APP_CLIENT_ID>"
   ```

4. Workload identity eklenmesi için pod'a **label** ekleyin:

   ```yaml
   metadata:
     labels:
       azure.workload.identity/use: "true"
   ```

5. IMDS'ye (`169.254.169.254`) **ağ erişimi** olduğundan emin olun — `NetworkPolicy` kullanıyorsanız, 80 numaralı bağlantı noktasında `169.254.169.254/32` hedefine trafiğe izin veren bir egress kuralı ekleyin.

### Auth type karşılaştırması

| Yöntem               | Yapılandırma                                  | Artıları                           | Eksileri                             |
| -------------------- | --------------------------------------------- | ---------------------------------- | ------------------------------------ |
| **Client secret**    | `appPassword`                                 | Kurulumu basit                     | Secret rotasyonu gerekir, daha az güvenli |
| **Certificate**      | `authType: "federated"` + `certificatePath`   | Ağ üzerinden paylaşılan secret yok | Sertifika yönetimi yükü              |
| **Managed Identity** | `authType: "federated"` + `useManagedIdentity` | Parolasız, yönetilecek secret yok  | Azure altyapısı gerekir              |

**Varsayılan davranış:** `authType` ayarlanmadığında OpenClaw varsayılan olarak client secret kimlik doğrulamasını kullanır. Mevcut yapılandırmalar değişiklik gerektirmeden çalışmaya devam eder.

## Yerel Geliştirme (Tünelleme)

Teams, `localhost` adresine erişemez. Yerel geliştirme için bir tünel kullanın:

**Seçenek A: ngrok**

```bash
ngrok http 3978
# https URL'sini kopyalayın, ör. https://abc123.ngrok.io
# Mesajlaşma endpoint'ini şu şekilde ayarlayın: https://abc123.ngrok.io/api/messages
```

**Seçenek B: Tailscale Funnel**

```bash
tailscale funnel 3978
# Mesajlaşma endpoint'i olarak Tailscale funnel URL'nizi kullanın
```

## Teams Developer Portal (Alternatif)

Manifest ZIP dosyasını manuel olarak oluşturmak yerine [Teams Developer Portal](https://dev.teams.microsoft.com/apps) kullanabilirsiniz:

1. **+ New app** seçeneğine tıklayın
2. Temel bilgileri doldurun (ad, açıklama, geliştirici bilgileri)
3. **App features** → **Bot** bölümüne gidin
4. **Enter a bot ID manually** seçeneğini seçin ve Azure Bot App ID'nizi yapıştırın
5. Kapsamları işaretleyin: **Personal**, **Team**, **Group Chat**
6. **Distribute** → **Download app package** seçeneğine tıklayın
7. Teams içinde: **Apps** → **Manage your apps** → **Upload a custom app** → ZIP dosyasını seçin

Bu yöntem, JSON manifest dosyalarını elle düzenlemekten çoğu zaman daha kolaydır.

## Botu test etme

**Seçenek A: Azure Web Chat (önce webhook'u doğrulayın)**

1. Azure Portal → Azure Bot kaynağınız → **Test in Web Chat**
2. Bir mesaj gönderin - bir yanıt görmelisiniz
3. Bu, Teams kurulumundan önce webhook endpoint'inizin çalıştığını doğrular

**Seçenek B: Teams (uygulama kurulumundan sonra)**

1. Teams uygulamasını kurun (sideload veya kuruluş kataloğu)
2. Teams içinde botu bulun ve bir DM gönderin
3. Gelen etkinlik için gateway günlüklerini kontrol edin

## Kurulum (yalnızca en düşük metin desteği)

1. **Microsoft Teams plugin'inin kullanılabilir olduğundan emin olun**
   - Güncel paketli OpenClaw sürümleri bunu zaten bundled olarak içerir.
   - Eski/özel kurulumlar bunu manuel olarak ekleyebilir:
     - npm'den: `openclaw plugins install @openclaw/msteams`
     - Yerel checkout'tan: `openclaw plugins install ./path/to/local/msteams-plugin`

2. **Bot kaydı**
   - Bir Azure Bot oluşturun (yukarıya bakın) ve şunları not edin:
     - App ID
     - Client secret (App password)
     - Tenant ID (single-tenant)

3. **Teams uygulama manifest'i**
   - `botId = <App ID>` olacak şekilde bir `bot` girdisi ekleyin.
   - Kapsamlar: `personal`, `team`, `groupChat`.
   - `supportsFiles: true` (kişisel kapsamda dosya işleme için gereklidir).
   - RSC izinlerini ekleyin (aşağıda).
   - Simgeleri oluşturun: `outline.png` (32x32) ve `color.png` (192x192).
   - Üç dosyanın tümünü birlikte zipleyin: `manifest.json`, `outline.png`, `color.png`.

4. **OpenClaw'ı yapılandırın**

   ```json5
   {
     channels: {
       msteams: {
         enabled: true,
         appId: "<APP_ID>",
         appPassword: "<APP_PASSWORD>",
         tenantId: "<TENANT_ID>",
         webhook: { port: 3978, path: "/api/messages" },
       },
     },
   }
   ```

   Yapılandırma anahtarları yerine ortam değişkenlerini de kullanabilirsiniz:
   - `MSTEAMS_APP_ID`
   - `MSTEAMS_APP_PASSWORD`
   - `MSTEAMS_TENANT_ID`
   - `MSTEAMS_AUTH_TYPE` (isteğe bağlı: `"secret"` veya `"federated"`)
   - `MSTEAMS_CERTIFICATE_PATH` (federated + sertifika)
   - `MSTEAMS_CERTIFICATE_THUMBPRINT` (isteğe bağlıdır, kimlik doğrulama için gerekmez)
   - `MSTEAMS_USE_MANAGED_IDENTITY` (federated + managed identity)
   - `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID` (yalnızca kullanıcı atanmış MI)

5. **Bot endpoint'i**
   - Azure Bot Messaging Endpoint değerini şu şekilde ayarlayın:
     - `https://<host>:3978/api/messages` (veya seçtiğiniz yol/port).

6. **Gateway'i çalıştırın**
   - Teams kanalı, bundled veya manuel olarak kurulmuş plugin kullanılabilir olduğunda ve `msteams` yapılandırması kimlik bilgileriyle mevcut olduğunda otomatik olarak başlar.

## Üye bilgisi eylemi

OpenClaw, Microsoft Teams için Graph destekli bir `member-info` eylemi sunar; böylece agent'lar ve otomasyonlar kanal üyesi ayrıntılarını (görünen ad, e-posta, rol) doğrudan Microsoft Graph'tan çözümleyebilir.

Gereksinimler:

- `Member.Read.Group` RSC izni (önerilen manifest'te zaten bulunur)
- Team'ler arası sorgular için: yönetici onaylı `User.Read.All` Graph Application izni

Bu eylem `channels.msteams.actions.memberInfo` tarafından denetlenir (varsayılan: Graph kimlik bilgileri mevcutsa etkindir).

## Geçmiş bağlamı

- `channels.msteams.historyLimit`, en son kanal/grup mesajlarından kaç tanesinin prompt içine sarılacağını denetler.
- `messages.groupChat.historyLimit` değerine geri düşer. Devre dışı bırakmak için `0` ayarlayın (varsayılan 50).
- Getirilen iş parçacığı geçmişi, gönderici izin listeleriyle (`allowFrom` / `groupAllowFrom`) filtrelenir; bu nedenle iş parçacığı bağlamı tohumlama yalnızca izin verilen göndericilerden gelen mesajları içerir.
- Alıntılanan ek bağlamı (Teams yanıt HTML'sinden türetilen `ReplyTo*`) şu anda alındığı gibi geçirilir.
- Başka bir deyişle, izin listeleri agent'ı kimin tetikleyebileceğini denetler; bugün yalnızca belirli ek bağlam yolları filtrelenmektedir.
- DM geçmişi `channels.msteams.dmHistoryLimit` ile sınırlandırılabilir (kullanıcı turu). Kullanıcı başına geçersiz kılmalar: `channels.msteams.dms["<user_id>"].historyLimit`.

## Mevcut Teams RSC izinleri (Manifest)

Bunlar, Teams uygulama manifest'imizdeki **mevcut resourceSpecific izinleridir**. Yalnızca uygulamanın kurulu olduğu team/sohbet içinde geçerlidirler.

**Kanallar için (team kapsamı):**

- `ChannelMessage.Read.Group` (Application) - tüm kanal mesajlarını @mention olmadan al
- `ChannelMessage.Send.Group` (Application)
- `Member.Read.Group` (Application)
- `Owner.Read.Group` (Application)
- `ChannelSettings.Read.Group` (Application)
- `TeamMember.Read.Group` (Application)
- `TeamSettings.Read.Group` (Application)

**Grup sohbetleri için:**

- `ChatMessage.Read.Chat` (Application) - tüm grup sohbeti mesajlarını @mention olmadan al

## Örnek Teams Manifest'i (gizlenmiş)

Gerekli alanları içeren en düşük, geçerli örnek. Kimlikleri ve URL'leri değiştirin.

```json5
{
  $schema: "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json",
  manifestVersion: "1.23",
  version: "1.0.0",
  id: "00000000-0000-0000-0000-000000000000",
  name: { short: "OpenClaw" },
  developer: {
    name: "Your Org",
    websiteUrl: "https://example.com",
    privacyUrl: "https://example.com/privacy",
    termsOfUseUrl: "https://example.com/terms",
  },
  description: { short: "OpenClaw in Teams", full: "OpenClaw in Teams" },
  icons: { outline: "outline.png", color: "color.png" },
  accentColor: "#5B6DEF",
  bots: [
    {
      botId: "11111111-1111-1111-1111-111111111111",
      scopes: ["personal", "team", "groupChat"],
      isNotificationOnly: false,
      supportsCalling: false,
      supportsVideo: false,
      supportsFiles: true,
    },
  ],
  webApplicationInfo: {
    id: "11111111-1111-1111-1111-111111111111",
  },
  authorization: {
    permissions: {
      resourceSpecific: [
        { name: "ChannelMessage.Read.Group", type: "Application" },
        { name: "ChannelMessage.Send.Group", type: "Application" },
        { name: "Member.Read.Group", type: "Application" },
        { name: "Owner.Read.Group", type: "Application" },
        { name: "ChannelSettings.Read.Group", type: "Application" },
        { name: "TeamMember.Read.Group", type: "Application" },
        { name: "TeamSettings.Read.Group", type: "Application" },
        { name: "ChatMessage.Read.Chat", type: "Application" },
      ],
    },
  },
}
```

### Manifest uyarıları (olmazsa olmaz alanlar)

- `bots[].botId`, Azure Bot App ID ile **aynı olmak zorundadır**.
- `webApplicationInfo.id`, Azure Bot App ID ile **aynı olmak zorundadır**.
- `bots[].scopes`, kullanmayı planladığınız yüzeyleri içermelidir (`personal`, `team`, `groupChat`).
- `bots[].supportsFiles: true`, kişisel kapsamda dosya işleme için gereklidir.
- Kanal trafiği istiyorsanız `authorization.permissions.resourceSpecific`, kanal okuma/gönderme izinlerini içermelidir.

### Mevcut bir uygulamayı güncelleme

Önceden kurulmuş bir Teams uygulamasını güncellemek için (ör. RSC izinleri eklemek amacıyla):

1. Yeni ayarlarla `manifest.json` dosyanızı güncelleyin
2. **`version` alanını artırın** (ör. `1.0.0` → `1.1.0`)
3. Manifest'i simgelerle birlikte **yeniden zipleyin** (`manifest.json`, `outline.png`, `color.png`)
4. Yeni zip'i yükleyin:
   - **Seçenek A (Teams Admin Center):** Teams Admin Center → Teams apps → Manage apps → uygulamanızı bulun → Upload new version
   - **Seçenek B (Sideload):** Teams içinde → Apps → Manage your apps → Upload a custom app
5. **Team kanalları için:** Yeni izinlerin etkili olması için uygulamayı her team'de yeniden kurun
6. Önbelleğe alınmış uygulama meta verilerini temizlemek için Teams'i **tamamen kapatıp yeniden başlatın** (yalnızca pencereyi kapatmayın)

## Yetenekler: yalnızca RSC ve Graph karşılaştırması

### **Yalnızca Teams RSC** ile (uygulama kurulu, Graph API izinleri yok)

Çalışır:

- Kanal mesajı **metin** içeriğini okumak.
- Kanal mesajı **metin** içeriğini göndermek.
- **Kişisel (DM)** dosya eklerini almak.

Çalışmaz:

- Kanal/grup **görsel veya dosya içerikleri** (payload yalnızca HTML saplaması içerir).
- SharePoint/OneDrive üzerinde depolanan ekleri indirmek.
- Mesaj geçmişini okumak (canlı webhook olayı dışında).

### **Teams RSC + Microsoft Graph Application izinleri** ile

Eklenenler:

- Barındırılan içerikleri indirmek (mesajlara yapıştırılmış görseller).
- SharePoint/OneDrive üzerinde depolanan dosya eklerini indirmek.
- Graph aracılığıyla kanal/sohbet mesaj geçmişini okumak.

### RSC ve Graph API karşılaştırması

| Yetenek                 | RSC İzinleri         | Graph API                           |
| ----------------------- | -------------------- | ----------------------------------- |
| **Gerçek zamanlı mesajlar** | Evet (webhook üzerinden) | Hayır (yalnızca polling)            |
| **Geçmiş mesajlar**     | Hayır                | Evet (geçmiş sorgulanabilir)        |
| **Kurulum karmaşıklığı** | Yalnızca uygulama manifest'i | Yönetici onayı + token akışı gerekir |
| **Çevrimdışı çalışır**  | Hayır (çalışıyor olmalı) | Evet (istendiğinde sorgulanabilir)  |

**Sonuç:** RSC gerçek zamanlı dinleme içindir; Graph API geçmiş erişimi içindir. Çevrimdışıyken kaçırılan mesajları sonradan almak için `ChannelMessage.Read.All` içeren Graph API gerekir (yönetici onayı gerektirir).

## Graph etkin medya + geçmiş (kanallar için gereklidir)

**Kanallarda** görsellere/dosyalara ihtiyacınız varsa veya **mesaj geçmişi** getirmek istiyorsanız, Microsoft Graph izinlerini etkinleştirmeniz ve yönetici onayı vermeniz gerekir.

1. Entra ID (Azure AD) **App Registration** içinde Microsoft Graph **Application permissions** ekleyin:
   - `ChannelMessage.Read.All` (kanal ekleri + geçmiş)
   - `Chat.Read.All` veya `ChatMessage.Read.All` (grup sohbetleri)
2. Kiracı için **yönetici onayı** verin.
3. Teams uygulama **manifest sürümünü** artırın, yeniden yükleyin ve uygulamayı Teams'te **yeniden kurun**.
4. Önbelleğe alınmış uygulama meta verilerini temizlemek için Teams'i **tamamen kapatıp yeniden başlatın**.

**Kullanıcı mention'ları için ek izin:** Kullanıcı @mention'ları, konuşmadaki kullanıcılar için doğrudan çalışır. Ancak mevcut konuşmada **olmayan** kullanıcıları dinamik olarak aramak ve mention etmek istiyorsanız, `User.Read.All` (Application) iznini ekleyin ve yönetici onayı verin.

## Bilinen sınırlamalar

### Webhook zaman aşımları

Teams, mesajları HTTP webhook üzerinden iletir. İşleme çok uzun sürerse (ör. yavaş LLM yanıtları), şunları görebilirsiniz:

- Gateway zaman aşımları
- Teams'in mesajı yeniden denemesi (yinelenen iletilere neden olur)
- Düşen yanıtlar

OpenClaw bunu hızlı yanıt verip sonrasında proaktif olarak yanıt göndererek ele alır, ancak çok yavaş yanıtlar yine de sorun yaratabilir.

### Biçimlendirme

Teams markdown desteği Slack veya Discord'a göre daha sınırlıdır:

- Temel biçimlendirme çalışır: **kalın**, _italik_, `code`, bağlantılar
- Karmaşık markdown (tablolar, iç içe listeler) doğru render edilmeyebilir
- Anketler ve rastgele kart gönderimleri için Adaptive Cards desteklenir (aşağıya bakın)

## Yapılandırma

Temel ayarlar (paylaşılan kanal kalıpları için bkz. `/gateway/configuration`):

- `channels.msteams.enabled`: kanalı etkinleştirir/devre dışı bırakır.
- `channels.msteams.appId`, `channels.msteams.appPassword`, `channels.msteams.tenantId`: bot kimlik bilgileri.
- `channels.msteams.webhook.port` (varsayılan `3978`)
- `channels.msteams.webhook.path` (varsayılan `/api/messages`)
- `channels.msteams.dmPolicy`: `pairing | allowlist | open | disabled` (varsayılan: pairing)
- `channels.msteams.allowFrom`: DM izin listesi (AAD nesne kimlikleri önerilir). Graph erişimi mevcut olduğunda sihirbaz, kurulum sırasında adları kimliklere çözümler.
- `channels.msteams.dangerouslyAllowNameMatching`: değiştirilebilir UPN/görünen ad eşleştirmesini ve doğrudan team/kanal adı yönlendirmesini yeniden etkinleştiren acil durum anahtarı.
- `channels.msteams.textChunkLimit`: giden metin parça boyutu.
- `channels.msteams.chunkMode`: önce boş satırlarda (paragraf sınırları) bölmek için `length` (varsayılan) veya `newline`, ardından uzunluğa göre parçalama yapılır.
- `channels.msteams.mediaAllowHosts`: gelen ek barındırıcıları için izin listesi (varsayılan olarak Microsoft/Teams alan adları).
- `channels.msteams.mediaAuthAllowHosts`: medya yeniden denemelerinde Authorization başlıkları eklemek için izin listesi (varsayılan olarak Graph + Bot Framework barındırıcıları).
- `channels.msteams.requireMention`: kanallarda/gruplarda @mention gerektirir (varsayılan true).
- `channels.msteams.replyStyle`: `thread | top-level` (bkz. [Yanıt stili](#reply-style-threads-vs-posts)).
- `channels.msteams.teams.<teamId>.replyStyle`: team başına geçersiz kılma.
- `channels.msteams.teams.<teamId>.requireMention`: team başına geçersiz kılma.
- `channels.msteams.teams.<teamId>.tools`: kanal geçersiz kılması eksik olduğunda kullanılan varsayılan team başına araç ilkesi geçersiz kılmaları (`allow`/`deny`/`alsoAllow`).
- `channels.msteams.teams.<teamId>.toolsBySender`: varsayılan team başına gönderici başına araç ilkesi geçersiz kılmaları (`"*"` joker karakteri desteklenir).
- `channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle`: kanal başına geçersiz kılma.
- `channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention`: kanal başına geçersiz kılma.
- `channels.msteams.teams.<teamId>.channels.<conversationId>.tools`: kanal başına araç ilkesi geçersiz kılmaları (`allow`/`deny`/`alsoAllow`).
- `channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender`: kanal başına gönderici başına araç ilkesi geçersiz kılmaları (`"*"` joker karakteri desteklenir).
- `toolsBySender` anahtarları açık önekler kullanmalıdır:
  `id:`, `e164:`, `username:`, `name:` (eski öneksiz anahtarlar hâlâ yalnızca `id:` ile eşlenir).
- `channels.msteams.actions.memberInfo`: Graph destekli üye bilgisi eylemini etkinleştirir veya devre dışı bırakır (varsayılan: Graph kimlik bilgileri mevcut olduğunda etkin).
- `channels.msteams.authType`: kimlik doğrulama türü — `"secret"` (varsayılan) veya `"federated"`.
- `channels.msteams.certificatePath`: PEM sertifika dosyasının yolu (federated + sertifika kimlik doğrulaması).
- `channels.msteams.certificateThumbprint`: sertifika thumbprint'i (isteğe bağlıdır, kimlik doğrulama için gerekmez).
- `channels.msteams.useManagedIdentity`: managed identity kimlik doğrulamasını etkinleştirir (federated modu).
- `channels.msteams.managedIdentityClientId`: kullanıcı atanmış managed identity için client ID.
- `channels.msteams.sharePointSiteId`: grup sohbetleri/kanallarda dosya yüklemeleri için SharePoint site ID'si (bkz. [Grup sohbetlerinde dosya gönderme](#sending-files-in-group-chats)).

## Yönlendirme ve Oturumlar

- Oturum anahtarları standart agent biçimini izler (bkz. [/concepts/session](/tr/concepts/session)):
  - Doğrudan mesajlar ana oturumu paylaşır (`agent:<agentId>:<mainKey>`).
  - Kanal/grup mesajları konuşma kimliğini kullanır:
    - `agent:<agentId>:msteams:channel:<conversationId>`
    - `agent:<agentId>:msteams:group:<conversationId>`

## Yanıt stili: Threads ve Posts

Teams kısa süre önce aynı temel veri modeli üzerinde iki kanal kullanıcı arayüzü stili sundu:

| Stil                     | Açıklama                                                 | Önerilen `replyStyle` |
| ------------------------ | -------------------------------------------------------- | --------------------- |
| **Posts** (klasik)       | Mesajlar kartlar olarak görünür, altında iş parçacıklı yanıtlar bulunur | `thread` (varsayılan) |
| **Threads** (Slack benzeri) | Mesajlar daha çok Slack gibi doğrusal akar             | `top-level`           |

**Sorun:** Teams API, bir kanalın hangi kullanıcı arayüzü stilini kullandığını göstermiyor. Yanlış `replyStyle` kullanırsanız:

- Threads stilindeki bir kanalda `thread` → yanıtlar rahatsız edici şekilde iç içe görünür
- Posts stilindeki bir kanalda `top-level` → yanıtlar iş parçacığı içinde değil, ayrı üst düzey gönderiler olarak görünür

**Çözüm:** `replyStyle` değerini kanalın nasıl ayarlandığına göre kanal başına yapılandırın:

```json5
{
  channels: {
    msteams: {
      replyStyle: "thread",
      teams: {
        "19:abc...@thread.tacv2": {
          channels: {
            "19:xyz...@thread.tacv2": {
              replyStyle: "top-level",
            },
          },
        },
      },
    },
  },
}
```

## Ekler ve görseller

**Mevcut sınırlamalar:**

- **DM'ler:** Görseller ve dosya ekleri, Teams bot dosya API'leri aracılığıyla çalışır.
- **Kanallar/gruplar:** Ekler M365 depolamasında (SharePoint/OneDrive) bulunur. Webhook payload'u gerçek dosya baytlarını değil, yalnızca bir HTML saplamasını içerir. Kanal eklerini indirmek için **Graph API izinleri gereklidir**.
- Açık dosya öncelikli gönderimler için `media` / `filePath` / `path` ile `action=upload-file` kullanın; isteğe bağlı `message` eşlik eden metin/yorum olur ve `filename` yüklenen adı geçersiz kılar.

Graph izinleri olmadan, görsel içeren kanal mesajları yalnızca metin olarak alınır (görsel içeriğine bot erişemez).
Varsayılan olarak OpenClaw yalnızca Microsoft/Teams ana makine adlarından medya indirir. `channels.msteams.mediaAllowHosts` ile geçersiz kılın (`["*"]` herhangi bir ana makineye izin verir).
Authorization başlıkları yalnızca `channels.msteams.mediaAuthAllowHosts` içindeki ana makineler için eklenir (varsayılan olarak Graph + Bot Framework ana makineleri). Bu listeyi sıkı tutun (çok kiracılı soneklerden kaçının).

## Grup sohbetlerinde dosya gönderme

Botlar, yerleşik FileConsentCard akışını kullanarak DM'lerde dosya gönderebilir. Ancak **grup sohbetleri/kanallarda dosya göndermek** ek kurulum gerektirir:

| Bağlam                   | Dosyalar nasıl gönderilir               | Gerekli kurulum                                  |
| ------------------------ | --------------------------------------- | ------------------------------------------------ |
| **DM'ler**               | FileConsentCard → kullanıcı kabul eder → bot yükler | Kutudan çıktığı gibi çalışır          |
| **Grup sohbetleri/kanallar** | SharePoint'e yükle → bağlantıyı paylaş | `sharePointSiteId` + Graph izinleri gerektirir |
| **Görseller (her bağlam)** | Satır içi base64 kodlu                | Kutudan çıktığı gibi çalışır                     |

### Grup sohbetleri neden SharePoint gerektirir?

Botların kişisel bir OneDrive sürücüsü yoktur (`/me/drive` Graph API endpoint'i uygulama kimlikleri için çalışmaz). Grup sohbetleri/kanallarda dosya göndermek için bot, bir **SharePoint sitesine** yükleme yapar ve bir paylaşım bağlantısı oluşturur.

### Kurulum

1. Entra ID (Azure AD) → App Registration içinde **Graph API izinlerini** ekleyin:
   - `Sites.ReadWrite.All` (Application) - dosyaları SharePoint'e yüklemek için
   - `Chat.Read.All` (Application) - isteğe bağlı, kullanıcı başına paylaşım bağlantılarını etkinleştirir

2. Kiracı için **yönetici onayı** verin.

3. **SharePoint site ID'nizi alın:**

   ```bash
   # Graph Explorer veya geçerli bir token ile curl üzerinden:
   curl -H "Authorization: Bearer $TOKEN" \
     "https://graph.microsoft.com/v1.0/sites/{hostname}:/{site-path}"

   # Örnek: "contoso.sharepoint.com/sites/BotFiles" konumundaki bir site için
   curl -H "Authorization: Bearer $TOKEN" \
     "https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/BotFiles"

   # Yanıtta şunlar bulunur: "id": "contoso.sharepoint.com,guid1,guid2"
   ```

4. **OpenClaw'ı yapılandırın:**

   ```json5
   {
     channels: {
       msteams: {
         // ... diğer yapılandırmalar ...
         sharePointSiteId: "contoso.sharepoint.com,guid1,guid2",
       },
     },
   }
   ```

### Paylaşım davranışı

| İzin                                    | Paylaşım davranışı                                       |
| --------------------------------------- | -------------------------------------------------------- |
| `Sites.ReadWrite.All` yalnızca          | Kuruluş genelinde paylaşım bağlantısı (kuruluştaki herkes erişebilir) |
| `Sites.ReadWrite.All` + `Chat.Read.All` | Kullanıcı başına paylaşım bağlantısı (yalnızca sohbet üyeleri erişebilir) |

Kullanıcı başına paylaşım daha güvenlidir; çünkü dosyaya yalnızca sohbet katılımcıları erişebilir. `Chat.Read.All` izni eksikse bot kuruluş genelinde paylaşıma geri düşer.

### Geri dönüş davranışı

| Senaryo                                          | Sonuç                                              |
| ------------------------------------------------ | -------------------------------------------------- |
| Grup sohbeti + dosya + `sharePointSiteId` yapılandırılmış | SharePoint'e yükle, paylaşım bağlantısı gönder |
| Grup sohbeti + dosya + `sharePointSiteId` yok    | OneDrive yüklemesini dene (başarısız olabilir), yalnızca metin gönder |
| Kişisel sohbet + dosya                           | FileConsentCard akışı (SharePoint olmadan çalışır) |
| Herhangi bir bağlam + görsel                     | Satır içi base64 kodlu (SharePoint olmadan çalışır) |

### Dosyaların depolandığı konum

Yüklenen dosyalar, yapılandırılmış SharePoint sitesinin varsayılan belge kitaplığındaki `/OpenClawShared/` klasöründe depolanır.

## Anketler (Adaptive Cards)

OpenClaw, Teams anketlerini Adaptive Cards olarak gönderir (yerel bir Teams anket API'si yoktur).

- CLI: `openclaw message poll --channel msteams --target conversation:<id> ...`
- Oylar gateway tarafından `~/.openclaw/msteams-polls.json` içinde kaydedilir.
- Oyların kaydedilmesi için gateway çevrimiçi kalmalıdır.
- Anketler henüz sonuç özetlerini otomatik olarak göndermez (gerekirse depo dosyasını inceleyin).

## Adaptive Cards (rastgele)

`message` aracı veya CLI kullanarak herhangi bir Adaptive Card JSON'unu Teams kullanıcılarına veya konuşmalarına gönderin.

`card` parametresi bir Adaptive Card JSON nesnesi kabul eder. `card` sağlandığında mesaj metni isteğe bağlıdır.

**Agent aracı:**

```json5
{
  action: "send",
  channel: "msteams",
  target: "user:<id>",
  card: {
    type: "AdaptiveCard",
    version: "1.5",
    body: [{ type: "TextBlock", text: "Hello!" }],
  },
}
```

**CLI:**

```bash
openclaw message send --channel msteams \
  --target "conversation:19:abc...@thread.tacv2" \
  --card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello!"}]}'
```

Kart şeması ve örnekler için [Adaptive Cards documentation](https://adaptivecards.io/) sayfasına bakın. Hedef biçimi ayrıntıları için aşağıdaki [Hedef biçimleri](#target-formats) bölümüne bakın.

## Hedef biçimleri

MSTeams hedefleri, kullanıcılar ile konuşmaları ayırt etmek için önekler kullanır:

| Hedef türü             | Biçim                            | Örnek                                               |
| ---------------------- | -------------------------------- | --------------------------------------------------- |
| Kullanıcı (ID ile)     | `user:<aad-object-id>`           | `user:40a1a0ed-4ff2-4164-a219-55518990c197`         |
| Kullanıcı (ad ile)     | `user:<display-name>`            | `user:John Smith` (Graph API gerektirir)           |
| Grup/kanal             | `conversation:<conversation-id>` | `conversation:19:abc123...@thread.tacv2`           |
| Grup/kanal (ham)       | `<conversation-id>`              | `19:abc123...@thread.tacv2` (`@thread` içeriyorsa) |

**CLI örnekleri:**

```bash
# Bir kullanıcıya ID ile gönder
openclaw message send --channel msteams --target "user:40a1a0ed-..." --message "Hello"

# Bir kullanıcıya görünen ad ile gönder (Graph API aramasını tetikler)
openclaw message send --channel msteams --target "user:John Smith" --message "Hello"

# Bir grup sohbetine veya kanala gönder
openclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" --message "Hello"

# Bir konuşmaya Adaptive Card gönder
openclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" \
  --card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello"}]}'
```

**Agent aracı örnekleri:**

```json5
{
  action: "send",
  channel: "msteams",
  target: "user:John Smith",
  message: "Hello!",
}
```

```json5
{
  action: "send",
  channel: "msteams",
  target: "conversation:19:abc...@thread.tacv2",
  card: {
    type: "AdaptiveCard",
    version: "1.5",
    body: [{ type: "TextBlock", text: "Hello" }],
  },
}
```

Not: `user:` öneki olmadan adlar varsayılan olarak grup/team çözümlemesine gider. Kişileri görünen adla hedeflerken her zaman `user:` kullanın.

## Proaktif mesajlaşma

- Proaktif mesajlar yalnızca bir kullanıcı etkileşim kurduktan **sonra** mümkündür; çünkü konuşma referanslarını o noktada depolarız.
- `dmPolicy` ve izin listesi geçitlemesi için `/gateway/configuration` bölümüne bakın.

## Team ve Channel ID'leri (Yaygın tuzak)

Teams URL'lerindeki `groupId` sorgu parametresi, yapılandırmada kullanılan team ID **değildir**. Bunun yerine kimlikleri URL yolundan çıkarın:

**Team URL'si:**

```
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=...
                                    └────────────────────────────┘
                                    Team ID (bunu URL kod çözümünden geçirin)
```

**Channel URL'si:**

```
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=...
                                      └─────────────────────────┘
                                      Channel ID (bunu URL kod çözümünden geçirin)
```

**Yapılandırma için:**

- Team ID = `/team/` sonrasındaki yol bölümü (URL kod çözümü yapılmış, ör. `19:Bk4j...@thread.tacv2`)
- Channel ID = `/channel/` sonrasındaki yol bölümü (URL kod çözümü yapılmış)
- `groupId` sorgu parametresini **yok sayın**

## Private Channels

Botların private channels içinde desteği sınırlıdır:

| Özellik                      | Standard Channels | Private Channels      |
| ---------------------------- | ----------------- | --------------------- |
| Bot kurulumu                 | Evet              | Sınırlı               |
| Gerçek zamanlı mesajlar (webhook) | Evet        | Çalışmayabilir        |
| RSC izinleri                 | Evet              | Farklı davranabilir   |
| @mentions                    | Evet              | Bot erişilebilirse    |
| Graph API geçmişi            | Evet              | Evet (izinlerle)      |

**Private channels çalışmıyorsa geçici çözümler:**

1. Bot etkileşimleri için standart kanalları kullanın
2. DM'leri kullanın - kullanıcılar her zaman bota doğrudan mesaj gönderebilir
3. Geçmiş erişimi için Graph API kullanın (`ChannelMessage.Read.All` gerektirir)

## Sorun giderme

### Yaygın sorunlar

- **Görseller kanallarda görünmüyor:** Graph izinleri veya yönetici onayı eksik. Teams uygulamasını yeniden kurun ve Teams'i tamamen kapatıp yeniden açın.
- **Kanalda yanıt yok:** varsayılan olarak mention gerekir; `channels.msteams.requireMention=false` ayarlayın veya team/kanal başına yapılandırın.
- **Sürüm uyuşmazlığı (Teams hâlâ eski manifest'i gösteriyor):** uygulamayı kaldırıp yeniden ekleyin ve yenilemek için Teams'i tamamen kapatın.
- **Webhook'tan 401 Unauthorized:** Azure JWT olmadan elle test ederken beklenir - endpoint'in erişilebilir olduğunu ancak kimlik doğrulamanın başarısız olduğunu gösterir. Düzgün test etmek için Azure Web Chat kullanın.

### Manifest yükleme hataları

- **"Icon file cannot be empty":** Manifest, 0 bayt olan simge dosyalarına başvuruyor. Geçerli PNG simgeleri oluşturun (`outline.png` için 32x32, `color.png` için 192x192).
- **"webApplicationInfo.Id already in use":** Uygulama hâlâ başka bir team/sohbette kurulu. Önce onu bulun ve kaldırın ya da yayılma için 5-10 dakika bekleyin.
- **Yüklemede "Something went wrong":** Bunun yerine [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com) üzerinden yükleyin, tarayıcı DevTools'u (F12) → Network sekmesini açın ve gerçek hata için yanıt gövdesini kontrol edin.
- **Sideload başarısız oluyor:** "Upload a custom app" yerine "Upload an app to your org's app catalog" seçeneğini deneyin - bu genellikle sideload kısıtlamalarını aşar.

### RSC izinleri çalışmıyor

1. `webApplicationInfo.id` değerinin botunuzun App ID'si ile tam olarak eşleştiğini doğrulayın
2. Uygulamayı yeniden yükleyin ve team/sohbette yeniden kurun
3. Kuruluş yöneticinizin RSC izinlerini engelleyip engellemediğini kontrol edin
4. Doğru kapsamı kullandığınızı doğrulayın: team'ler için `ChannelMessage.Read.Group`, grup sohbetleri için `ChatMessage.Read.Chat`

## Referanslar

- [Azure Bot Oluşturma](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - Azure Bot kurulum kılavuzu
- [Teams Developer Portal](https://dev.teams.microsoft.com/apps) - Teams uygulamaları oluşturma/yönetme
- [Teams uygulama manifest şeması](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema)
- [RSC ile kanal mesajlarını alma](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc)
- [RSC izinleri başvurusu](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent)
- [Teams bot dosya işleme](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (kanal/grup için Graph gerekir)
- [Proaktif mesajlaşma](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages)

## İlgili

- [Kanallara Genel Bakış](/tr/channels) — desteklenen tüm kanallar
- [Pairing](/tr/channels/pairing) — DM kimlik doğrulaması ve pairing akışı
- [Gruplar](/tr/channels/groups) — grup sohbeti davranışı ve mention geçitlemesi
- [Kanal Yönlendirmesi](/tr/channels/channel-routing) — mesajlar için oturum yönlendirmesi
- [Güvenlik](/tr/gateway/security) — erişim modeli ve sıkılaştırma
