Skip to main content
ClaudeWave
Skill358 repo starsupdated today

add-office365

The add-office365 skill integrates the Office 365 Outlook connector into Power Apps, enabling calendar management and email operations. Use this skill when building applications that require accessing calendars, creating or updating events, sending emails, reading inbox messages, or managing Outlook items programmatically.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/microsoft/power-platform-skills /tmp/add-office365 && cp -r /tmp/add-office365/plugins/code-apps/skills/add-office365 ~/.claude/skills/add-office365
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

**📋 Shared Instructions: [shared-instructions.md](${CLAUDE_PLUGIN_ROOT}/shared/shared-instructions.md)** - Cross-cutting concerns.

# Add Office 365 Outlook

## Workflow

1. Check Memory Bank -> 2. Add Connector -> 3. Review Generated Service -> 4. Configure -> 5. Build -> 6. Update Memory Bank

---

### Step 1: Check Memory Bank

Check for `memory-bank.md` per [shared-instructions.md](${CLAUDE_PLUGIN_ROOT}/shared/shared-instructions.md).

### Step 2: Add Connector

**First, find the connection ID** (see [connector-reference.md](${CLAUDE_PLUGIN_ROOT}/shared/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.

```bash
npx power-apps add-data-source -a office365 -c <connection-id>
```

### Step 3: Review Generated Service

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):

#### Calendar Operations

| 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)                                                   |

#### Email Operations

| 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`                              |

#### Contact Operations

| Method              | Purpose              |
| ------------------- | -------------------- |
| `GetContactFolders` | List contact folders |
| `ContactGetTables`  | List contact tables  |

### Step 4: Configure

Ask the user what Office 365 Outlook operations they need (skip if already specified by caller).

**Calendar -- Get events for a date range:**

```typescript
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:**

```typescript
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:**

```typescript
await Office365OutlookService.CalendarDeleteItem("Calendar", eventId);
```

**Email -- Send an email:**

```typescript
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:**

```typescript
const result = await Office365OutlookService.GetEventsCalendarViewV2(...);
if (result.success) {
  const events = result.data?.value || [];
} else {
  console.error("Failed:", result.error);
}
```

### Step 5: Build

```bash
npm run build
```

Fix TypeScript errors before proceeding. Do NOT deploy yet.

### Step 6: Update Memory Bank

Update `memory-bank.md` with: connector added, configured operations, build status.
add-data-sourceSkill

Guide the user to add a data source, connection, or API connector to a Canvas App via Power Apps Studio, then verify and continue. USE WHEN the user asks to add a data source, add a connection, add an API, add a connector, connect to SharePoint / Dataverse / SQL / Excel / OneDrive / Teams / Office 365, or any similar request to make new data available to the app. DO NOT USE WHEN the user is asking to list or describe existing data sources — call list_data_sources or list_apis directly instead.

canvas-appSkill

Creates or edits a Power Apps Canvas App through the Canvas Authoring MCP coauthoring session. Handles new app generation from requirements, simple inline edits, and complex multi-screen changes with parallel screen builders. Triggers on requests to create, build, generate, modify, update, change, or edit a Canvas App or .pa.yaml files.

configure-canvas-mcpSkill

Configure the Canvas Authoring MCP server for the current coauthoring session. USE WHEN "configure MCP", "set up MCP server", "MCP not working", "connect Canvas Apps MCP", "canvas-authoring not available", "MCP not configured", "set up canvas apps". DO NOT USE WHEN prerequisites are missing — direct the user to install .NET 10 SDK first.

generate-canvas-appSkill

[DEPRECATED — use canvas-app instead] Generate a complete Power Apps canvas app.

report-issueSkill

>

add-azuredevopsSkill

Adds Azure DevOps connector to a Power Apps code app. Use when querying work items, creating bugs, managing pipelines, or making ADO API calls.

add-connectorSkill

Adds any Power Platform connector to a Power Apps code app. Generic fallback for connectors not covered by a specific skill.

add-datasourceSkill

Adds a data source or connector to a Power Apps code app. Asks what the user wants to accomplish and routes to the appropriate specialized skill.