{
  "title": "Send an Adaptive Card to a conversation",
  "content": "openclaw message send --channel msteams --target \"conversation:19:abc...@thread.tacv2\" \\\n  --card '{\"type\":\"AdaptiveCard\",\"version\":\"1.5\",\"body\":[{\"type\":\"TextBlock\",\"text\":\"Hello\"}]}'\njson theme={null}\n{\n  \"action\": \"send\",\n  \"channel\": \"msteams\",\n  \"target\": \"user:John Smith\",\n  \"message\": \"Hello!\"\n}\njson theme={null}\n{\n  \"action\": \"send\",\n  \"channel\": \"msteams\",\n  \"target\": \"conversation:19:abc...@thread.tacv2\",\n  \"card\": {\n    \"type\": \"AdaptiveCard\",\n    \"version\": \"1.5\",\n    \"body\": [{ \"type\": \"TextBlock\", \"text\": \"Hello\" }]\n  }\n}\n\nhttps://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=...\n                                    └────────────────────────────┘\n                                    Team ID (URL-decode this)\n\nhttps://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=...\n                                      └─────────────────────────┘\n                                      Channel ID (URL-decode this)\n```\n\n* Team ID = path segment after `/team/` (URL-decoded, e.g., `19:Bk4j...@thread.tacv2`)\n* Channel ID = path segment after `/channel/` (URL-decoded)\n* **Ignore** the `groupId` query parameter\n\nBots have limited support in private channels:\n\n| Feature                      | Standard Channels | Private Channels       |\n| ---------------------------- | ----------------- | ---------------------- |\n| Bot installation             | Yes               | Limited                |\n| Real-time messages (webhook) | Yes               | May not work           |\n| RSC permissions              | Yes               | May behave differently |\n| @mentions                    | Yes               | If bot is accessible   |\n| Graph API history            | Yes               | Yes (with permissions) |\n\n**Workarounds if private channels don't work:**\n\n1. Use standard channels for bot interactions\n2. Use DMs - users can always message the bot directly\n3. Use Graph API for historical access (requires `ChannelMessage.Read.All`)\n\n* **Images not showing in channels:** Graph permissions or admin consent missing. Reinstall the Teams app and fully quit/reopen Teams.\n* **No responses in channel:** mentions are required by default; set `channels.msteams.requireMention=false` or configure per team/channel.\n* **Version mismatch (Teams still shows old manifest):** remove + re-add the app and fully quit Teams to refresh.\n* **401 Unauthorized from webhook:** Expected when testing manually without Azure JWT - means endpoint is reachable but auth failed. Use Azure Web Chat to test properly.\n\n### Manifest upload errors\n\n* **\"Icon file cannot be empty\":** The manifest references icon files that are 0 bytes. Create valid PNG icons (32x32 for `outline.png`, 192x192 for `color.png`).\n* **\"webApplicationInfo.Id already in use\":** The app is still installed in another team/chat. Find and uninstall it first, or wait 5-10 minutes for propagation.\n* **\"Something went wrong\" on upload:** Upload via [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com) instead, open browser DevTools (F12) → Network tab, and check the response body for the actual error.\n* **Sideload failing:** Try \"Upload an app to your org's app catalog\" instead of \"Upload a custom app\" - this often bypasses sideload restrictions.\n\n### RSC permissions not working\n\n1. Verify `webApplicationInfo.id` matches your bot's App ID exactly\n2. Re-upload the app and reinstall in the team/chat\n3. Check if your org admin has blocked RSC permissions\n4. Confirm you're using the right scope: `ChannelMessage.Read.Group` for teams, `ChatMessage.Read.Chat` for group chats\n\n* [Create Azure Bot](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - Azure Bot setup guide\n* [Teams Developer Portal](https://dev.teams.microsoft.com/apps) - create/manage Teams apps\n* [Teams app manifest schema](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema)\n* [Receive channel messages with RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc)\n* [RSC permissions reference](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent)\n* [Teams bot file handling](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (channel/group requires Graph)\n* [Proactive messaging](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages)",
  "code_samples": [
    {
      "code": "**Agent tool examples:**",
      "language": "unknown"
    },
    {
      "code": "",
      "language": "unknown"
    },
    {
      "code": "Note: Without the `user:` prefix, names default to group/team resolution. Always use `user:` when targeting people by display name.\n\n## Proactive messaging\n\n* Proactive messages are only possible **after** a user has interacted, because we store conversation references at that point.\n* See `/gateway/configuration` for `dmPolicy` and allowlist gating.\n\n## Team and Channel IDs (Common Gotcha)\n\nThe `groupId` query parameter in Teams URLs is **NOT** the team ID used for configuration. Extract IDs from the URL path instead:\n\n**Team URL:**",
      "language": "unknown"
    },
    {
      "code": "**Channel URL:**",
      "language": "unknown"
    }
  ],
  "headings": [
    {
      "level": "h2",
      "text": "Proactive messaging",
      "id": "proactive-messaging"
    },
    {
      "level": "h2",
      "text": "Team and Channel IDs (Common Gotcha)",
      "id": "team-and-channel-ids-(common-gotcha)"
    },
    {
      "level": "h2",
      "text": "Private Channels",
      "id": "private-channels"
    },
    {
      "level": "h2",
      "text": "Troubleshooting",
      "id": "troubleshooting"
    },
    {
      "level": "h3",
      "text": "Common issues",
      "id": "common-issues"
    },
    {
      "level": "h3",
      "text": "Manifest upload errors",
      "id": "manifest-upload-errors"
    },
    {
      "level": "h3",
      "text": "RSC permissions not working",
      "id": "rsc-permissions-not-working"
    },
    {
      "level": "h2",
      "text": "References",
      "id": "references"
    }
  ],
  "url": "llms-txt#send-an-adaptive-card-to-a-conversation",
  "links": []
}