IT

Install Microsoft 365 from the connector catalog

Step-by-step Entra app registration and Harriet catalog install for the sandboxed Microsoft 365 MCP connector (pinned npx package, per-user OAuth).

Harriet's Microsoft 365 connector catalog entry installs a version-pinned sandboxed npx server (@softeria/ms-365-mcp-server) that calls Microsoft Graph on behalf of each signed-in user. This article walks through Entra app registration and what to enter in the catalog install wizard.

Before you install from the catalog

1. Register an app in Microsoft Entra ID

  1. Open Azure PortalMicrosoft Entra IDApp registrationsNew registration.
  2. Name the app (for example Harriet Microsoft 365 MCP).
  3. Supported account types:
    • Single tenant — only users in your organisation (use your tenant ID in the optional tenant field during install).
    • Multitenant (work/school) — any organisational account (organizations tenant; Harriet's default).
  4. Leave the redirect URI blank for now; you will add Harriet's callback after install (see below).

2. Create a client secret

Under Certificates & secretsNew client secret. Copy the Value immediately (it is shown only once). You will paste it into the catalog wizard as the OAuth client secret.

3. Add Microsoft Graph delegated permissions

Under API permissionsAdd a permissionMicrosoft GraphDelegated permissions, add the scopes your organisation is willing to grant. The catalog template requests the full org-mode tool surface from @softeria/ms-365-mcp-server@0.118.1 (mail, calendar, Teams, SharePoint, OneDrive, and related Graph APIs).

To see the exact permission list for the pinned package:

npx @softeria/ms-365-mcp-server@0.118.1 --org-mode --list-permissions

Two rules here:

  • Delegated permissions only. Never add Application permissions — they grant tenant-wide access without a signed-in user and always require admin consent. Delegated permissions only ever act as the signed-in user: a user who connects gets access to their own mailbox, files, and chats, nothing more.
  • This list must cover the connector's OAuth scope. The consent screen users see is driven by the scopes Harriet requests at sign-in (the OAuth scope field on the connector), not by this portal list. If Harriet requests a scope that was never consented, users are prompted (or blocked) again — keep the two lists matching. If you trim the connector's OAuth scope in Harriet, tools needing the removed scopes will fail; keep offline_access in the scope so refresh tokens are issued.

4. Let non-admin users connect (fix "Need admin approval")

By default, most Entra tenants do not let ordinary users consent to app permissions, so when a non-admin connects their account they are stopped at a "Need admin approval" screen. Two ways to resolve it — the first is recommended:

Option A — grant tenant-wide admin consent once (recommended).

  1. In Azure Portal open Microsoft Entra IDApp registrations → your Harriet app → API permissions.
  2. Click Grant admin consent for <your organisation> and confirm. The Status column shows a green "Granted" tick for every permission.
  3. Done — users connect from Profile → Integrations with a plain sign-in and no approval screen.

This does not give Harriet admin-level access or the admin's data. Consent and access are separate things: admin consent only pre-approves the permission prompt for the tenant. Because every permission is delegated, each user's token is still issued for their account and can only reach what that user can already access in Microsoft 365.

Option B — allow users to self-consent.

If you would rather have each user approve the permissions themselves: in the Entra admin center open IdentityApplicationsEnterprise applicationsConsent and permissionsUser consent settings, and select Allow user consent for apps. Users then see a normal consent screen listing the permissions and accept it for their own account.

Caveat: some Graph permissions can never be consented by a non-admin regardless of this setting — anything whose "Admin consent required" column reads Yes on the app's API permissions page (typically directory-wide reads such as Directory.Read.All, User.Read.All, Group.Read.All, ChannelMessage.Read.All, TeamMember.Read.All). If the connector's OAuth scope includes any of those, non-admins still hit the approval screen; either remove them from the connector's OAuth scope field in Harriet (and from the app registration) or use Option A.

Why the "Request approval" box on that screen goes nowhere: the request-and-approve flow is Entra's admin consent workflow, which is disabled by default — the screen shows a request box, but no admin ever receives anything actionable. It can be enabled under Enterprise applicationsAdmin consent settings (set Users can request admin consent to apps they are unable to consent to to Yes and assign reviewers), but approving a request just performs the same tenant-wide admin consent as Option A — so using the Grant admin consent button directly is simpler.

5. Configure the redirect URI (before install)

Harriet uses one shared OAuth callback for all MCP connectors — you do not need an integration ID. Register this Web redirect URI in Entra:

https://harriethq.com/bots/integrations/mcp/oauth/callback/

In Entra, under AuthenticationAdd a platformWeb, add that URI. Use Web, not SPA, for the confidential client flow Harriet uses.

Catalog install wizard

From Provisioner → Connectors → Add from catalog → Microsoft 365:

Step What to enter
OAuth client ID Application (client) ID from the Entra app overview
OAuth client secret The secret value from step 2
Tenant ID (optional) Your directory (tenant) GUID, or leave blank to use organizations

Harriet pre-fills the sandboxed npx command with a pinned package version and --org-mode. You do not need the provisioner.hosted_mcp plan feature for this catalog connector.

After install

  1. Open Profile → Integrations and connect your own Microsoft account (smoke test).
  2. On the connector in Company settings → Integrations, run Sync tools.
  3. Set tool permissions and attach the connector to the right skills and groups.

Per-user tokens are delivered to the server as access token values on the MS365_MCP_OAUTH_TOKEN environment variable. See also Set up OAuth for a sandboxed MCP connector (Google / Microsoft 365) for field-by-field OAuth and $SECRET_KEY guidance.

Upgrading the pinned package version

Harriet bumps the pinned npm version via catalog data migrations. After an upgrade, re-run Sync tools and confirm Entra permissions still match --list-permissions for the new version.

Use Harriet in your organisation for searchable help, AI assistance, and your company knowledge base.

Log in to Harriet