# Microsoft Graph — Teams & Presence  · replaces agent365 `teams`

Paging: add `max_items=N` to any GET (≤ 1000). Coverage + limits: see the SKILL.md guide.

## Teams chats / channels / meetings  (WAM only)

Reachable only when the **WAM broker** is available (via the Outlook first-party
app). On a browser-harvest-only host these 403 → use agent365's Teams server.

| Task | Call |
|------|------|
| My chats | `GET /me/chats?$top=20&$select=id,topic,chatType` |
| One chat | `GET /me/chats/{chat-id}?$select=id,topic,chatType` |
| Chat members | `GET /chats/{chat-id}/members` (no `$top` — it 400s) |
| Messages in a chat | `GET /chats/{chat-id}/messages?$top=20` (no `$select` on the list) |
| One message | `GET /chats/{chat-id}/messages/{message-id}` |
| Send a chat message | `POST /chats/{chat-id}/messages` → `{"body":{"content":"hi"}}` |
| Teams I'm in | `GET /me/joinedTeams?$select=id,displayName` (no `$top` — it 400s) |
| Channels in a team | `GET /teams/{team-id}/channels?$select=id,displayName` |
| Channel messages | `GET /teams/{team-id}/channels/{channel-id}/messages?$top=20` |
| Create an online meeting | `POST /me/onlineMeetings` → `{"subject":"Sync","startDateTime":"…Z","endDateTime":"…Z"}` |

`/me/onlineMeetings` has no list form — a GET needs a `$filter` on `joinWebUrl` or
`videoTeleconferenceId`; create with POST. Chat/channel message bodies are HTML —
strip tags when summarizing.

## Presence

| Task | Call |
|------|------|
| My presence | `GET /me/presence` |
| Another user | `GET /users/{id}/presence` (needs `Presence.Read.All` — may 403) |
| Several users | `POST /communications/getPresencesByUserId` → `{"ids":["{id1}","{id2}"]}` (may 403) |
