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.
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.
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.ioat 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. |
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.
Identity and governance
- Entra SSO:
entra_sso=1makes 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 asAuthorization: Bearerto the gateway, which authenticates / bills by the real user — no separategateway_tokenor 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 — the gateway doesn't conjure identities out of thin air;name_exprmaps 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; useaccess_policiesinstead 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.mjsauto-wires the gateway's built-in/mcpendpoint. - 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/.ps1is 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:
- Your own gateway — this is the whole point.
- Microsoft Entra / Graph — the Office add-in's auth and mailbox / calendar, cannot be removed.
- 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:
[
{
"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:
[
{
"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.
Next
- Deploy the Office add-in for production deployment and the six-item tested pitfall checklist.
- Get the gateway running first: Docker single node.
- Authenticate / bill by the real user on the gateway side, in coordination with Configure SSO enterprise login.
