About microsoft-teams
A skill for reading and sending Microsoft Teams chats through Microsoft Graph using curl and jq. It guides work or school account authorization and clarifies that channel messages and personal accounts are unsupported.
Key features
- 01List one-to-one and group chats
- 02Read recent chat messages
- 03Send chat messages
- 04Explain account and permission errors
Use cases
- 01Review recent conversations
- 02Send a message to a Teams chat
MCP support
This is a skill, not an MCP server; it describes using Microsoft Graph via curl and jq.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ acedatacloud/ skills --skill microsoft-teamsAfter installing, type/microsoft-teamsin Claude Code to confirm it loaded.
Details
From the project READMEDrive 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.