plugins/code-apps/skills/add-office365/SKILL.md
Adds Office 365 Outlook connector to a Power Apps code app. Use when accessing calendars, sending emails, reading inbox, or managing Outlook events.
npx skillsauth add microsoft/power-platform-skills add-office365Install this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
📋 Shared Instructions: shared-instructions.md - Cross-cutting concerns.
Check for memory-bank.md per shared-instructions.md.
First, find the connection ID (see connector-reference.md):
Run the /list-connections skill. Find the Office 365 Outlook connection in the output (API name contains office365). If none exists, direct the user to create one using the environment-specific Connections URL — construct it from the active environment ID in context (from power.config.json or a prior step): https://make.powerapps.com/environments/<environment-id>/connections → + New connection → search for the connector → Create.
npx power-apps add-data-source -a office365 -c <connection-id>
The generated service file (src/generated/services/Office365OutlookService.ts) is large. Use Grep to find specific methods instead of reading the entire file:
Grep pattern="async \w+" path="src/generated/services/Office365OutlookService.ts"
Key methods (sorted by common usage):
| Method | Purpose | Key Parameters |
| ------------------------- | -------------------------- | -------------------------------------------------------- |
| GetEventsCalendarViewV2 | Get events in a date range | calendarId, startDateTimeOffset, endDateTimeOffset |
| V3CalendarPostItem | Create a calendar event | table (calendar ID), item (CalendarEventHtmlClient) |
| CalendarDeleteItem | Delete an event | table (calendar ID), id (event ID) |
| CalendarPatchItem | Update an event | table, id, item |
| V2CalendarGetTables | List available calendars | (none) |
| Method | Purpose | Key Parameters |
| ----------------- | ------------------ | ---------------------------------------- |
| SendEmailV2 | Send an email | emailMessage (body, to, subject, etc.) |
| GetEmails | Get inbox emails | folderPath, fetchOnlyUnread, top |
| GetEmail | Get single email | messageId |
| MarkAsRead | Mark email as read | messageId |
| ReplyToV3 | Reply to an email | messageId, body |
| Flag / Unflag | Flag/unflag email | messageId |
| Method | Purpose |
| ------------------- | -------------------- |
| GetContactFolders | List contact folders |
| ContactGetTables | List contact tables |
Ask the user what Office 365 Outlook operations they need (skip if already specified by caller).
Calendar -- Get events for a date range:
import { Office365OutlookService } from "../generated/services/Office365OutlookService";
const result = await Office365OutlookService.GetEventsCalendarViewV2(
"Calendar", // calendarId -- "Calendar" for default
startDate.toISOString(),
endDate.toISOString()
);
const events = result.data?.value || [];
Calendar -- Create an event:
await Office365OutlookService.V3CalendarPostItem("Calendar", {
Subject: "Focus Time",
Start: "2025-06-15T10:00:00", // ISO 8601 format
End: "2025-06-15T11:00:00",
ShowAs: "Busy",
Importance: "Normal",
IsAllDay: false,
Body: "<p>Blocked for focus work</p>",
Reminder: 5
});
Calendar -- Delete an event:
await Office365OutlookService.CalendarDeleteItem("Calendar", eventId);
Email -- Send an email:
await Office365OutlookService.SendEmailV2({
To: "<recipient-address>",
Subject: "Subject line",
Body: "<p>HTML email body</p>",
Importance: "Normal"
});
Key types:
| Type | Purpose |
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| CalendarEventClientReceiveStringEnums | Read model -- has Subject, Start, End, Id, ShowAs, IsAllDay, Organizer |
| CalendarEventHtmlClient | Write model -- requires Subject, Start, End; optional Body, ShowAs, Importance, Reminder |
| EntityListResponse_CalendarEventClientReceiveStringEnums | Response wrapper -- access events via .value |
Response pattern:
const result = await Office365OutlookService.GetEventsCalendarViewV2(...);
if (result.success) {
const events = result.data?.value || [];
} else {
console.error("Failed:", result.error);
}
npm run build
Fix TypeScript errors before proceeding. Do NOT deploy yet.
Update memory-bank.md with: connector added, configured operations, build status.
tools
Adds Work IQ (M365 Copilot Search) to a Power Apps code app via the Work IQ Copilot MCP connector (shared_a365copilotchatmcp), then wires up a production-ready McpSession wrapper for AI-powered, knowledge-grounded search and chat. Use when integrating Microsoft 365 Copilot search/chat. The CopilotChat tool searches internal Microsoft 365 content (documents, emails, chats, sites, files) across your organization — prefer workload-specific tools (SharePoint, OneDrive, Teams, Mail) when the workload is explicit; do not use it for general knowledge, news, public web, or external information.
tools
Use when the user wants to preview generated screens in a browser without starting Metro / a simulator — for example after /create-mobile-app finishes or after /edit-app regenerates a screen.
development
Use when the user wants to iterate on an existing generated Power Apps mobile app after /create-mobile-app: update the plan, data model, native capabilities, design, screens, generated app code, and preview without restarting the full project flow.
development
Creates and manages the brand design system for a Power Apps mobile app. Generates brand/design-system.md (source of truth), brand/tokens.ts (importable Tamagui tokens), and brand/design-system.html (visual gallery). Triggered at Step 6.5 of /create-mobile-app, or standalone via /design-system.