- Every task-pane conversation routes through Portkey
- Model choice is pinned by config, not by the user
- Budget caps, rate limits, and guardrails enforce on every request
- Requests are attributed per user and team in Logs and Analytics
How it works
The add-in is hosted by Anthropic atpivot.claude.ai. You host nothing. The only artifact you produce is a manifest XML, and your gateway settings ride in it as URL query parameters on the task-pane URL.
pivot.claude.ai and your gateway host through the corporate firewall.
Prerequisites
1. Add a provider integration
Connect the upstream model source Portkey calls on your behalf. Go to Model Catalog → Add Provider.Anthropic
AWS Bedrock
Vertex AI
2. Create a config with override_params
The add-in sends Anthropic-API model names from its built-in model picker — claude-sonnet-4-5, claude-opus-4-5, and so on. Those names won’t resolve against your workspace’s provider slugs, so pin the target model with override_params.
Go to Configs → Create Config:
@{provider-slug}/{model} addressing, where the slug is the integration from step 1.
m365-{team}-{env}. Examples: m365-finance-prod, m365-legal-prod.override_params replaces the matching field in the incoming request. Whatever model the add-in’s picker sends is discarded, and every request is served by the model named here.
Configs also carry reliability features. Open the relevant section if you need them:
Add fallbacks for reliability
Add fallbacks for reliability
Enable caching
Enable caching
Route by team with conditional routing
Route by team with conditional routing
3. Create the API key
Go to API Keys → create one key per team or environment.Attach the config from step 2
Attach budget and rate limits
Turn on Allow config override
4. Verify the gateway before building anything
A manifest pointing at an unreachable model deploys perfectly and then fails at the user’s first message. Probe first.claude-sonnet-4-5, the override isn’t applying. Re-check Allow config override on the API key.
authorization, not x-api-key. The add-in supports only those two header schemes, and Portkey rejects its API key on x-api-key with Invalid API Key. Error Code: 03. Portkey’s native x-portkey-api-key works with curl but the add-in cannot send it.5. Install the manifest generator
The manifest is built byclaude-for-msft-365-install, a Claude Code plugin published by Anthropic. It fetches the canonical manifest template and appends your gateway settings as URL query parameters.
Confirm Node.js is installed
Add the marketplace and install the plugin
Restart the Claude Code session
Set the plugin path
ls ~/.claude/plugins/cache/claude-for-financial-services/claude-for-msft-365-install/. Inside a session, ${CLAUDE_PLUGIN_ROOT} resolves automatically.claude plugin update claude-for-msft-365-install@claude-for-financial-services, then restart.
Option A — guided wizard
Run the wizard and answer its prompts. It handles everything from provider choice through Admin Center upload:Option B — generate directly
To skip the wizard, call the build script yourself. Excel, Word, and PowerPoint share one manifest. Outlook uses a different Microsoft schema and needs its own:The four gateway keys
Version and Id
<Version>. M365 Admin Center caches by <Id> + <Version> and silently ignores a re-upload at the same version — the most common cause of “I updated it but nothing changed”.
6. Test locally, then deploy
Sideload on one machine first. This bypasses the 24–72 hour Admin Center cache entirely, and a sideloaded manifest wins over a centrally deployed one with the same<Id>.
clear-addin-cache.sh --id <GUID> --apply. It’s dry-run by default and only ever touches that one ID.
Deploy the add-in for your organization
Open Integrated apps
Select the app type
manifest.xml.Admin Center validates on upload — the same check as office-addin-manifest validate.Assign users
Accept permissions and finish
Repeat for Outlook
manifest-outlook.xml as a separate app if Outlook was generated.<Id> UUID — every client then treats it as a brand-new add-in.Update the manifest
Rotating the Portkey key, changing the model list, or adding any config key means regenerating and re-uploading. Run the four commands in this order:1. Regenerate with the new values
2. Bump the fourth version segment
3. Confirm the bump and validate
4. Re-upload in Admin Center → Integrated apps → your add-in → Update
Hand-editing the manifest is otherwise fine, and those edits do reach users — trimming<Host> entries to drop PowerPoint, for example. Re-apply them after each regeneration, and bump <Version> regardless of how the change was made, or Admin Center serves the cached copy.
<Id> unchanged so Admin Center treats this as an update to the existing add-in rather than a second, parallel installation.Attribute requests per user and team
Addinference_headers to the manifest to tag every request with metadata Portkey uses for filtering, cost attribution, and conditional routing:
/claude-for-msft-365-install:bootstrap).
Optional configuration
Each of these is anotherkey=value argument to the build command.
available_models — control the model picker
available_models — control the model picker
mcp_servers — attach in-network tools
mcp_servers — attach in-network tools
headers present means static auth; absent triggers OAuth discovery. Values interpolate other config keys.disabled_features — lock features org-wide
disabled_features — lock features org-wide
{domain}.{action} form:web_search with mcp_servers to substitute an in-network search tool. Unknown slugs are ignored.auto_connect and allow_1p — the connection screen
auto_connect and allow_1p — the connection screen
auto_connect=0 to show the form prefilled instead.The Back button to Claude.ai sign-in is hidden whenever enterprise config is present. Set allow_1p=1 to keep it.otlp_endpoint — send traces to your collector
otlp_endpoint — send traces to your collector
/v1/traces and posts OTLP/HTTP. gRPC isn’t supported — the add-in runs in a browser WebView.Portkey also exports traces natively. See OpenTelemetry.Security
Mitigate at the Portkey layer rather than trying to hide the key:- Scope each key narrowly with its own config, budget cap, and rate limit
- Issue one key per team so revocation and rotation are surgical
- Rotate on a schedule — regenerating the manifest is one command
/claude-for-msft-365-install:bootstrap), which returns per-user JSON config at startup and overrides manifest values.
Pre-launch checklist
Requests appear in Logs
The correct model responds
model field in the log entry. It should match the step 2 config, not the add-in’s picker.Policies trigger
Cost attribution is accurate
Firewall allows both hosts
pivot.claude.ai for the add-in payload, and your gateway host for model traffic.Troubleshooting
Wrong model answers, or a provider error about an unknown model
Wrong model answers, or a provider error about an unknown model
401 or 403 from the gateway
401 or 403 from the gateway
gateway_auth_header=authorization; Portkey rejects its key on x-api-key. Re-run the step 4 probe.Updated the manifest but users see old config
Updated the manifest but users see old config
<Version> — bump the fourth segment. Then the client Wef cache holds until the app restarts; clear it with clear-addin-cache.sh --id <GUID> --apply and fully quit Office. Service-side propagation takes up to 72 hours for updates.Add-in doesn't appear in the ribbon
Add-in doesn't appear in the ribbon
<Hosts> is missing that app — check both the top-level <Hosts> list and the one under <VersionOverrides>.Connection failed
Connection failed
Request: block and a Manifest params: block with identical key names — diff them. Matching values mean the manifest went through unchanged and the problem is upstream. Raw error: is ground truth.Reading the WebView console
Reading the WebView console
defaults write com.microsoft.Excel OfficeWebAddinDeveloperExtras -bool true, enable Safari’s developer features, then enable your terminal under System Settings → Privacy & Security → Developer Tools. That third gate is the one everyone misses. Right-click in the task pane → Inspect Element.Windows: right-click in the task pane → Inspect. No setup needed with WebView2.Wef folder” fix destroys them along with the manifest cache. Export first with /claude-for-msft-365-install:export-data.
