api-patterns
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
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.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill teams --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/teamsContext 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.
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: mcp.wyre.ai
Repo: wyre-technology/msp-claude-plugins
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
3CX's live-operations surface: read-only visibility into active calls, recordings, voicemail, department and queue membership, and forwarding/presence…
3CX's read-only directory surface: resolving a caller by email or by exact extension, searching the PBX's own phonebooks, searching contacts synced from an…
3CX's system-and-configuration surface: server time, PBX event log and application log search, service status, database schema and the read-only SELECT-only…
Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and remediation actions, and…
Abnormal Security message analysis: message retrieval, email header inspection, attachments, sender reputation, delivery context, and SPF/DKIM/DMARC…