From code-apps-preview
Adds Office 365 Outlook connector to Power Apps code apps using pac CLI, generating TypeScript service for calendar events, email sending, inbox reading, and event management.
npx claudepluginhub microsoft/power-platform-skills --plugin code-apps-previewThis skill is limited to using the following tools:
**๐ Shared Instructions: [shared-instructions.md](${CLAUDE_PLUGIN_ROOT}/shared/shared-instructions.md)** - Cross-cutting concerns.
Adds any Power Platform connector to Power Apps code apps as generic fallback for connectors without dedicated skills. Delegates common ones like SharePoint, Teams, Excel to specific skills.
Provides Python CLI access to Microsoft 365 services including Outlook emails, Calendar events, OneDrive files, To Do tasks, and Contacts via MS Graph API.
Scaffolds Vite + React + TypeScript project for Power Apps Code Apps with PAC CLI, SDK integration, connectors, configs, scripts, and sample authenticated UI.
Share bugs, ideas, or general feedback.
๐ 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.
pwsh -NoProfile -Command "pac code 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.