microsoft-teams
SkillCommunicationMicrosoft 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.
No other account needed.
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.contentfor HTML messages contains markup — strip tags when summarizing.- OData
$top/$expandneed 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