microsoft-teams

SkillCommunication

Microsoft Teams API integration with managed OAuth. Manage teams, channels, messages, and meetings via Microsoft Graph API. Use this skill when users want to list teams, create channels, send messages, schedule meetings, or access meeting recordings and transcripts. For other third party apps, use t

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the microsoft-teams skill

What this skill tells your AI

The instructions your AI receives, as published by craftos-dev/craftbot in skills/microsoft-teams/SKILL.md and read by ahel’s review.

Drive Microsoft Teams chats via Microsoft Graph with curl + jq. The user's OAuth bearer token is in $MICROSOFT_TEAMS_TOKEN; every call needs Authorization: Bearer $MICROSOFT_TEAMS_TOKEN. Base URL: https://graph.microsoft.com/v1.0.

Failures are {"error":{"code","message"}} — show message verbatim. 401 = re-install. 403/Forbidden on send = the user granted read-only (Chat.Read) → re-connect with Chat.ReadWrite + ChatMessage.Send.

403 "No authorization information present on the request" on /me/chats = the connected account is a personal Microsoft account. Teams chat is a work/school (organization) feature — Microsoft Graph does not expose /me/chats or grant the Chat.* scopes for personal MSA accounts (outlook.com/hotmail/etc). Tell the user plainly: "Microsoft Teams chat needs a work or school account; your connected account is a personal Microsoft account. Reconnect Teams and choose a work/school account." Do not retry — it cannot succeed for that account.

G="https://graph.microsoft.com/v1.0"; AUTH="Authorization: Bearer $MICROSOFT_TEAMS_TOKEN"
# My chats (1:1 + group), most recent first; expand members for names
curl -sS -H "$AUTH" "$G/me/chats?\$top=20&\$expand=members" \
  | jq '.value[] | {id, chatType, topic, members: [.members[].displayName]}'

Read & send chat messages

CHAT="CHAT_ID"
# Recent messages
curl -sS -H "$AUTH" "$G/chats/$CHAT/messages?\$top=20" \
  | jq '.value[] | {from: .from.user.displayName, created: .createdDateTime, text: .body.content}'

# Send a message (confirm content with the user first). contentType html|text.
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"body":{"contentType":"html","content":"Hi from the assistant 👋"}}' \
  "$G/chats/$CHAT/messages" | jq '{id, created: .createdDateTime}'

Gotchas

  • Chats only. Reading Teams channel messages needs ChannelMessage.Read.All — a Microsoft "protected API" requiring tenant-admin consent — which this connector deliberately does not request. Don't try /teams/{id}/channels/.../messages; it will 403.
  • body.content for HTML messages contains markup — strip tags when summarizing.
  • OData $top/$expand need the $ escaped in the shell; quote the URL.

Signals

GitHub stars
382
Forks
45
Last commit
Sep 2026

ahel review

  • S4info
    community integration — published by craftos-dev, not microsoft

Automated review, not a security audit. Ruleset v1.

Advanced
Catalog kind
skill
Gateway key
microsoft-teams
Source
github.com/craftos-dev/craftbot