> Raw Markdown twin (generated at build time from the source Markdown). Rendered page: https://docs.gatellm.io/en/usecases/office-m365-addin · Doc index: https://docs.gatellm.io/en/llms.txt


# Office / Microsoft 365 add-in

GateLLM's Office / Microsoft 365 add-in (package codename `gatellm-for-msft-365-localhost`) is an independent, self-contained package: it pre-bundles the Office add-in SPA that the official version loads from `https://pivot.gatellm.io` by default into a local HTTPS static server, points the manifest at **your own origin**, and works together with **your own model gateway**.

::: info How to obtain the package
The deployment package is provided by GateLLM to signed customers and is **not publicly downloadable**. If you haven't obtained it yet, contact us via the [official product page](https://www.gatellm.io/office-addin).
:::

## Goal

Let enterprise users call models through their own model gateway directly inside Excel / Word / PowerPoint / Outlook:

- **Data stays in the intranet**: the self-hosted SPA's requests go directly to your own gateway, not through any third-party server.
- **Zero dependency on pivot**: the SPA is committed with the package and scrubbed clean, and never touches `pivot.gatellm.io` at runtime — including not fetching on first launch.
- **The add-in has no built-in model**: it connects to your own gateway / cloud, not offline local inference.

## Architecture

```
Office (WebView)  ──<SourceLocation>──▶  local HTTPS static server   ──gateway_url──▶  your LLM gateway
                                          (pre-bundled SPA, 79 files, scrubbed)
```

- The add-in loads in the Office WebView, pointing to your local (or CDN-hosted) HTTPS static server.
- That server hosts a **pre-bundled scrubbed SPA**: the Sentry / GrowthBook defaults are turned off.
- All model requests are sent by the add-in directly to your gateway address `gateway_url`.

## What the four hosts can do

Strictly speaking these are **two independent add-ins**, not one add-in with four hosts:

- **Office edition** (Excel / Word / PowerPoint): one `manifest-office.xml`, TaskPaneApp mode;
- **Outlook edition**: a separate `manifest-outlook-3p.xml`, MailApp mode.

The reason they're split into two: the manifest modes differ, and so do the **permission models** — Outlook reads mailbox / calendar via Microsoft Graph and needs a separate tenant-level admin consent. Each is uploaded and versioned separately in the M365 admin center; deploying only one of them is perfectly fine.

The two add-ins ship 33 built-in skills, grouped by host:

| Host | Built-in skills |
|------|---------|
| **Excel** (financial modeling) | `audit-xls` (formula accuracy / balance-sheet balancing / cash-flow reconciliation check), `lbo-model` (LBO templates and formulas), `dcf-model` (DCF / WACC / sensitivity from SEC filings), `3-statement-model` (three-statement linkage completion), `clean-data-xls` (trim / case / date / dedupe), `comps-analysis` (comparable-company multiples and statistical benchmarks) |
| **PowerPoint** (slides / IB) | `competitive-analysis` (competitive-landscape deck framework), `deck-refresh` (quarterly / earnings / comp-roll updates), `ib-check-deck` (IB presentation numeric-consistency QC), `competitive-landscape` (competitor-landscape paragraphs), `industry-overview` (IC memo / CIM industry preamble) |
| **Word** (legal / contracts) | `check-doc` (defined terms / cross-references / numbering / signature blocks), `copy-edit` (mechanical proofreading), `summarize-contract` (contract executive summary), `flag-issues` (grade Critical/High/Med/Low per playbook), `fallback` (pull approved clauses), `compare-versions` (redline / two-version diff), `plain-language` (rewrite for non-lawyers), `clean-for-send` (Company Draft / Clean copy), `insert-clause` / `silent-on` / `draft-from-template` (insert clause / silent handling / draft from template) |
| **Outlook** (mail / calendar) | `storylining` (narrative structuring), `triage` (inbox grading), `summarize-thread` (thread summary), `find` / `schedule` / `meeting-prep` / `commitments` (find / schedule / pre-meeting prep / commitments), `open-attachment` / `morning-claude` / `prep-meeting` (open attachment / morning brief / pre-meeting prep) |
| **Meta** | `skillify` (generate a new skill from a conversation) |

## Four paths to connect a model

The add-in supports four connection paths, with `gateway` recommended:

| Path | Description |
|------|------|
| **gateway** (recommended) | The add-in only recognizes your gateway address, `gateway_url` + `gateway_token`. The gateway is the GateLLM gateway described in this documentation. |
| **vertex** | Direct to Google Vertex AI, requires `gcp_project_id` / `gcp_region` / `google_client_id` / `google_client_secret`. |
| **bedrock** | Direct to AWS Bedrock, requires `aws_role_arn` / `aws_region`. |
| **foundry** | Direct to Azure Foundry, requires `azure_resource_name` / `azure_api_key`. |

::: warning Direct Bedrock does not yet support Outlook
Amazon Bedrock direct-connect mode does **not** support the Outlook host (`build-manifest.mjs` errors out when passed `aws_*` for `outlook`). Outlook via the `gateway` mode is not restricted.
:::

Outlook reads mailbox and calendar via Microsoft Graph; regardless of which path the model uses, it needs a one-time tenant-level admin consent; see [Deploy the Office add-in](/en/howto/deploy-office-addin.md).

## Identity and governance

- **Entra SSO**: `entra_sso=1` makes the add-in obtain an Entra ID token at startup. You can bring your own Entra app (`graph_client_id` / `entra_scope`), otherwise it uses the default multi-tenant app.
- **Entra token directly as the gateway Bearer**: with `gateway_auth_source=entra`, the add-in sends the Entra access token directly as `Authorization: Bearer` to the gateway, which authenticates / bills by the real user — no separate `gateway_token` or bootstrap relay needed. ("Not needed" means the add-in side embeds no credentials; the gateway side still needs a pre-created same-name access key per [Configure SSO enterprise login](/en/howto/configure-sso.md) — the gateway doesn't conjure identities out of thin air; `name_expr` maps the Entra identity to a same-name key before allowing it through.)
- **access_policies (IAM-style allow/deny)**: gate add-in capabilities by condition. Two label-condition controls are implemented:
  - `addin.access` — the add-in is simply not allowed to run on a document with a certain sensitivity label;
  - `file.upload` — a file with a certain label is not allowed to be uploaded as an attachment.
  Both match by **Microsoft Purview sensitivity label GUID** (`mip_label_guid`), which is stable across renames / multiple languages.
- **disabled_features (flat switches)**: `skills.authoring` / `thumbs` / `addin.access` / `file.upload`, simple global switches; use `access_policies` instead when you need per-document / per-file conditional control.
- **bootstrap_url (per-user configuration endpoint)**: distributes provider key / `mcpservers` / `skills` / `disabledfeatures`, and its response overrides manifest values.
- **mcpservers**: you can attach your own MCP; when not explicitly configured, `build-manifest.mjs` auto-wires the gateway's built-in `/mcp` endpoint.
- **otlp_endpoint** (with headers / resource attributes): send OpenTelemetry traces to your own collector.

## Data plane

- Chat history / uploaded skills / MCP registration / memory / settings are **all stored in the user's local browser storage**, with no server-side copy.
- `export-addin-data.sh` / `.ps1` is a **read-only export**: it only reads Office storage and writes to a designated directory, changing or deleting nothing inside Office.
- Storage is indexed by the add-in's **load origin**, not the add-in ID — switching manifests, reinstalling, and sideload ↔ store-version switching all preserve data.

## Remaining external dependencies (as-is)

The self-hosted SPA removes `pivot.gatellm.io`, but it is **not "zero external dependency"**. The rest are all expected:

1. **Your own gateway** — this is the whole point.
2. **Microsoft Entra / Graph** — the Office add-in's auth and mailbox / calendar, cannot be removed.
3. **Your own hosted bootstrap endpoint** (if used) — this never went through pivot anyway.

## FAQ

**Q: Does the add-in send data to Anthropic / pivot?**

No. The self-hosted SPA has zero runtime dependency on `pivot.gatellm.io` (it doesn't even fetch on first launch), and model requests go directly to your own gateway; the Sentry / GrowthBook defaults in the bundle are scrubbed off, and if you want telemetry, set `otlp_endpoint` to point at your own collector.

**Q: How do I disable the add-in on a certain class of sensitive documents?**

Use the `addin.access` rule of `access_policies` to deny by **Purview label GUID** (`mip_label_guid`). The label GUID is stable across renames / multiple languages. Minimal example — the add-in simply doesn't run when opening a document with a certain label:

```json
[
  {
    "effect": "deny",
    "action": "addin.access",
    "resource": {
      "type": "open_file",
      "identifiers": [{ "type": "mip_label_guid", "equals": "<label-guid>" }]
    }
  }
]
```

To forbid uploading a file with that label as an attachment, write a second statement, and **`action` and `resource.type` must change together**: use `file.upload` for `action` and `uploaded_file` for `resource.type` (matching by the attachment's own label) — changing only the resource without changing the action has no effect. The two kinds of rules are independent; to forbid "all forms", write both:

```json
[
  {
    "effect": "deny",
    "action": "file.upload",
    "resource": {
      "type": "uploaded_file",
      "identifiers": [{ "type": "mip_label_guid", "equals": "<label-guid>" }]
    }
  }
]
```

For how to get the label GUID, how to write an allowlist, and how to cover multiple actions in one `action` array, see `commands/access-policies.md` in the package.

**Q: What's the difference between Outlook and Excel / Word / PowerPoint?**

They are two independent add-ins: Outlook uses a separate MailApp manifest (`manifest-outlook-3p.xml`) and reads mailbox and calendar via Microsoft Graph, requiring tenant-level admin consent; Excel / Word / PowerPoint share a TaskPaneApp manifest (`manifest-office.xml`). In addition, the direct Bedrock mode doesn't yet support Outlook (the `gateway` mode is not restricted).

**Q: Can I test the add-in against a gateway running on localhost first?**

No. Testing shows the Office WebView cannot reach a gateway on localhost (even over HTTPS with a locally trusted certificate); the gateway must be deployed at an address with a public domain name + trusted CA certificate, and a staging environment suffices. See the pitfall checklist in [Deploy the Office add-in](/en/howto/deploy-office-addin.md).

## Next

- [Deploy the Office add-in](/en/howto/deploy-office-addin.md) for production deployment and the six-item tested pitfall checklist.
- Get the gateway running first: [Docker single node](/en/quickstart/docker-single-node.md).
- Authenticate / bill by the real user on the gateway side, in coordination with [Configure SSO enterprise login](/en/howto/configure-sso.md).
