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
45200 skills146 agents200 commands4 MCP
Install
$ npx -y skills add wyre-technology/msp-claude-plugins --skill teams --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/teams

Context preview

The summary Claude sees to decide when to auto-load this skill.

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.

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
Ships withmsp-claude-plugins

One command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: mcp.wyre.ai

Get the whole plugin

Other skills on msp-claude-plugins.