# Add Office365

> Adds Office 365 Outlook connector to a Power Apps code app. Use when accessing calendars, sending emails, reading inbox, or managing Outlook events.

- **Type:** Skill
- **Install:** `agentstack add skill-microsoft-power-platform-skills-add-office365`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [microsoft](https://agentstack.voostack.com/s/microsoft)
- **Installs:** 0
- **Category:** [Developer Tools](https://agentstack.voostack.com/c/developer-tools)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [microsoft](https://github.com/microsoft)
- **Source:** https://github.com/microsoft/power-platform-skills/tree/main/plugins/code-apps/skills/add-office365
- **Website:** https://aka.ms/ppskills

## Install

```sh
agentstack add skill-microsoft-power-platform-skills-add-office365
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

**📋 Shared Instructions: [shared-instructions.md](${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](${PLUGIN_ROOT}/shared/shared-instructions.md).

### Step 2: Add Connector

**First, find the connection ID** (see [connector-reference.md](${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//connections` → **+ New connection** → search for the connector → Create.

```bash
npx power-apps add-data-source -a office365 -c 
```

### 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: "Blocked for focus work",
  Reminder: 5
});
```

**Calendar -- Delete an event:**

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

**Email -- Send an email:**

```typescript
await Office365OutlookService.SendEmailV2({
  To: "",
  Subject: "Subject line",
  Body: "HTML email body",
  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.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [microsoft](https://github.com/microsoft)
- **Source:** [microsoft/power-platform-skills](https://github.com/microsoft/power-platform-skills)
- **License:** MIT
- **Homepage:** https://aka.ms/ppskills

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-microsoft-power-platform-skills-add-office365
- Seller: https://agentstack.voostack.com/s/microsoft
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
