mcpField
M
microsoft-teams

microsoft-teams

github.com/acedatacloudProductivity17170 installsUpdated today
Repository

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

  1. 01List one-to-one and group chats
  2. 02Read recent chat messages
  3. 03Send chat messages
  4. 04Explain account and permission errors

Use cases

  1. 01Review recent conversations
  2. 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-teams

After installing, type/microsoft-teamsin Claude Code to confirm it loaded.

Details

From the project README

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.

Comments

Markdown supported