Skip to content
Development
Skill

/teams

Microsoft Teams through Microsoft Graph: the Team/Channel/Member/Meeting/Tab object model, team and channel enumeration, membership and ownership changes, online meetings, usage reporting, and the causes behind Teams access failures.

From plugin
msp-claude-plugins
55200 skills165 agents200 commands4 MCP

Claude Code

$ npx -y skills add wyre-ai/msp-claude-plugins --skill teams --agent claude-code

SKILL.md

teams.SKILL.md
name: "Microsoft 365 Teams"
description: >
  Microsoft Teams through Microsoft Graph: the Team/Channel/Member/Meeting/Tab
  object model, team and channel enumeration, membership and ownership changes,
  online meetings, usage reporting, and the causes behind Teams access failures.
when_to_use: >-
  When enumerating or administering Teams, channels, and membership, or troubleshooting a
  Teams access problem. Use when: microsoft teams, m365 teams, teams
  channel, teams membership, teams meeting, teams access, teams troubleshoot, list teams m365,
  teams usage, or teams admin.

Microsoft Teams Management

Overview

Microsoft Teams is the collaboration hub for most M365 customers. MSP support tasks include troubleshooting access issues, managing team membership, reviewing channel structure, and investigating meeting problems. All Teams data is accessible through Microsoft Graph.

Anti-triggers

"Team" means something different in four of the plugins an MSP has installed. Here it is a Microsoft 365 collaboration workspace backed by an Entra group:

  • **A scheduling pool of technicians** — TimeZest teams are round-robin

availability groups with no Microsoft Teams involvement at all; use the `timezest` plugin (`timezest-agents-and-teams`).

  • **A PSA dispatch queue or technician group** — use the PSA plugins

(`halopsa`, `connectwise`, `kaseya/autotask`).

  • **Booking or rescheduling a meeting** — creating the calendar event

is `m365-calendar`; this skill covers the Teams objects the meeting hangs off.

  • **Reading Teams chat for an investigation** — message retrieval for

compromise or eDiscovery work is a security and retention question, not a membership one; start at `m365-security`.

Core Teams Objects

| Object | Description | API Resource | |--------|-------------|-------------| | **Team** | Top-level workspace | `/teams/{id}` | | **Channel** | Conversation thread within a team | `/teams/{id}/channels/{id}` | | **Member** | User in a team (owner or member) | `/teams/{id}/members` | | **Meeting** | Online meeting or channel event | `/me/onlineMeetings` | | **Tab** | App integration in a channel | `/teams/{id}/channels/{id}/tabs` |

Graph API Patterns

List All Teams a User Belongs To

GET /v1.0/users/{userId}/joinedTeams?$select=id,displayName,description,visibility

**Response:**

{
  "value": [
    {
      "id": "team-guid",
      "displayName": "Engineering",
      "description": "Engineering team workspace",
      "visibility": "private"
    }
  ]
}

List All Teams in the Tenant (Admin View)

GET /v1.0/groups?$filter=resourceProvisioningOptions/Any(x:x eq 'Team')&$select=id,displayName,description,createdDateTime,visibility

Get Team Details

GET /v1.0/teams/{teamId}?$select=id,displayName,description,isArchived,memberSettings,guestSettings,messagingSettings

List Channels in a Team

GET /v1.0/teams/{teamId}/channels?$select=id,displayName,description,membershipType,createdDateTime

**Channel types:**

  • `standard` — Open to all team members
  • `private` — Invite-only subset of team members
  • `shared` — Shared with external users or other teams

Get Team Members

GET /v1.0/teams/{teamId}/members?$select=id,displayName,email,roles

**Roles:** `owner` or `member` (empty array = member)

Add a Member to a Team

POST /v1.0/teams/{teamId}/members
Content-Type: application/json

{
  "@odata.type": "#microsoft.graph.aadUserConversationMember",
  "roles": [],
  "user@odata.bind": "https://graph.microsoft.com/v1.0/users/{userId}"
}

**To add as owner:** set `"roles": ["owner"]`

Remove a Member from a Team

DELETE /v1.0/teams/{teamId}/members/{memberId}

Create a New Team

POST /v1.0/teams
Content-Type: application/json

{
  "template@odata.bind": "https://graph.microsoft.com/v1.0/teamsTemplates('standard')",
  "displayName": "IT Support",
  "description": "Internal IT support team",
  "visibility": "private",
  "members": [
    {
      "@odata.type": "#microsoft.graph.aadUserConversationMember",
      "roles": ["owner"],
      "user@odata.bind": "https://graph.microsoft.com/v1.0/users/{ownerUserId}"
    }
  ]
}

Archive a Team (Inactive Projects)

POST /v1.0/teams/{teamId}/archive
Content-Type: application/json

{
  "shouldSetSpoSiteReadOnlyForMembers": true
}

Get Channel Messages (Last 20)

GET /v1.0/teams/{teamId}/channels/{channelId}/messages?$top=20&$orderby=createdDateTime desc

Teams Meetings

Get a User's Upcoming Meetings

GET /v1.0/users/{userId}/calendar/events?$filter=start/dateTime ge '2024-01-15T00:00:00' and isOnlineMeeting eq true&$select=subject,start,end,organizer,onlineMeeting&$orderby=start/dateTime

Get Online Meeting Details (Join URL)

GET /v1.0/users/{userId}/onlineMeetings/{meetingId}?$select=subject,startDateTime,endDateTime,joinUrl,participants

Create an Online Meeting

POST /v1.0/users/{userId}/onlineMeetings
Content-Type: application/json

{
  "startDateTime": "2024-01-20T14:00:00Z",
  "endDateTime": "2024-01-20T15:00:00Z",
  "subject": "IT Onboarding Session"
}

Common MSP Workflows

New Employee Teams Onboarding

1. Get list of teams the employee's manager belongs to 2. Add new user to relevant teams as member 3. Add to department-specific private channels 4. Add as member (not owner) unless explicitly needed

Employee Offboarding from Teams

1. List all teams user belongs to (`/joinedTeams`) 2. For each team: check if user is the sole owner 3. If sole owner: assign another owner before removal 4. Remove user from all teams 5. Archive any teams that were personal/project-specific

Find Teams Without Owners

GET /v1.0/groups?$filter=resourceProvisioningOptions/Any(x:x eq 'Team')&$select=id,displayName

Then for each team:

GET /v1.0/teams/{teamId}/members?$filter=roles/any(r:r eq
Read more
@wyre-technology
Ships withmsp-claude-plugins

One command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: wyre-ai.github.io/msp-claude-plugins

55200 skills165 agents4 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
55
Star history of wyre-technology/msp-claude-plugins on GitHub, a chart by star-history.com

Other skills on msp-claude-plugins.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about teams.

Which coding agents can use teams?
teams installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.