account-hygiene
Periodic hygiene review of a client's 1Password account for QBRs and license true-ups: reconciling active and suspended seats…
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.
Claude Code
$ npx -y skills add wyre-ai/msp-claude-plugins --skill teams --agent claude-code
Codex
$ npx skills add wyre-ai/msp-claude-plugins --skill teams -a codex -y
Cursor
$ npx skills add wyre-ai/msp-claude-plugins --skill teams -a cursor -y
Gemini CLI
$ npx skills add wyre-ai/msp-claude-plugins --skill teams -a gemini-cli -y
GitHub Copilot
$ npx skills add wyre-ai/msp-claude-plugins --skill teams -a github-copilot -y
OpenCode
$ npx skills add wyre-ai/msp-claude-plugins --skill teams -a opencode -y
Windsurf
$ npx skills add wyre-ai/msp-claude-plugins --skill teams -a windsurf -y
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 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.
"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:
availability groups with no Microsoft Teams involvement at all; use the `timezest` plugin (`timezest-agents-and-teams`).
(`halopsa`, `connectwise`, `kaseya/autotask`).
is `m365-calendar`; this skill covers the Teams objects the meeting hangs off.
compromise or eDiscovery work is a security and retention question, not a membership one; start at `m365-security`.
| 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` |
GET /v1.0/users/{userId}/joinedTeams?$select=id,displayName,description,visibility**Response:**
{
"value": [
{
"id": "team-guid",
"displayName": "Engineering",
"description": "Engineering team workspace",
"visibility": "private"
}
]
}GET /v1.0/groups?$filter=resourceProvisioningOptions/Any(x:x eq 'Team')&$select=id,displayName,description,createdDateTime,visibility
GET /v1.0/teams/{teamId}?$select=id,displayName,description,isArchived,memberSettings,guestSettings,messagingSettingsGET /v1.0/teams/{teamId}/channels?$select=id,displayName,description,membershipType,createdDateTime**Channel types:**
GET /v1.0/teams/{teamId}/members?$select=id,displayName,email,roles**Roles:** `owner` or `member` (empty array = member)
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"]`
DELETE /v1.0/teams/{teamId}/members/{memberId}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}"
}
]
}POST /v1.0/teams/{teamId}/archive
Content-Type: application/json
{
"shouldSetSpoSiteReadOnlyForMembers": true
}GET /v1.0/teams/{teamId}/channels/{channelId}/messages?$top=20&$orderby=createdDateTime descGET /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/dateTimeGET /v1.0/users/{userId}/onlineMeetings/{meetingId}?$select=subject,startDateTime,endDateTime,joinUrl,participantsPOST /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"
}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
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
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 eqOne command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: wyre-ai.github.io/msp-claude-plugins
Periodic hygiene review of a client's 1Password account for QBRs and license true-ups: reconciling active and suspended seats…
1Password MCP fundamentals through Conduit: the region plus two independent credential halves (Events Reporting token, Users API…
How to review a departing or departed user's 1Password footprint with the read-only tools: confirm the seat is suspended, find…
Triage of 1Password sign-in attempts for one client account: pulling the sign-in feed over a window, grouping failures by user,…
3CX's live-operations surface: read-only visibility into active calls, recordings, voicemail, department and queue membership,…
3CX's read-only directory surface: resolving a caller by email or by exact extension, searching the PBX's own phonebooks,…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.