Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.
Before you start
A Microsoft account — personal, work or school. Postern reads the mail, calendar and
contacts of the account you sign in with.
Postern installed and started, with the Console open at http://127.0.0.1:8787. The Console
opens only on the machine Postern runs on. If Postern runs on a NAS or another machine, open the
Console from your own computer over SSH first:
Open the Console over SSH.
About 15 minutes, in two browser tabs — Entra in one, the Console in the other. You go back
and forth three times. One of those moves interrupts a half-filled Entra form, so leave that tab
open.
10 uninterrupted minutes for the last step. Postern holds the sign-in open for 10 minutes
and cannot pause it.
1
Start a new app registration
At entra.microsoft.com, sign in with the account whose mail, calendar
and contacts you want. You register your own app. Postern ships no shared one.The portal’s masthead reads Microsoft Entra admin center. In the left rail, open Entra ID,
then App registrations.On the App registrations page, an account with no apps yet shows There are no applications
here. Press + New registration. The registration form opens.In Name, type Postern. Entra’s helper under that box reads “The user-facing display name for
this application (this can be changed later).”Do not submit the registration form yet. The next two steps fill in the rest of it.
A dialog headed Register an application opens instead of the form. It reads: “The ability to
create applications outside of a directory has been deprecated. You may get a new directory by
joining the M365 Developer Program or signing up for Azure.” Its only button is Cancel, and
the same words sit in an amber bar across the page. Your Microsoft account has no directory yet.
Take joining the M365 Developer Program or signing up for Azure. Finish that sign-up. Then
come back and press + New registration again. That is expected, not a wrong turn.
2
Choose the account type that covers personal accounts
In the same form, find Supported account types. Entra prints “Choose the account types that can
use this application or access this API” beneath it.Open the dropdown and choose this row:
The dropdown opens on Single tenant only - Default Directory. Take Any Entra ID Tenant + Personal Microsoft accounts.
3
Add the redirect URI under the desktop platform
Do not choose Single-page application (SPA). Microsoft caps that platform’s sign-in at 24
hours, so you would sign in again every day, and no Postern setting changes that. Choose
Public client/native (mobile & desktop).
Lower in the same form, open Select a platform and choose Public client/native (mobile &
desktop).
Take Public client/native (mobile & desktop). Single-page application (SPA) costs you a sign-in every day.
A redirect URI is the address Microsoft sends you back to after you approve. Microsoft matches it
exactly, character for character.Leave the Entra tab open. In your second tab, open the Console at http://127.0.0.1:8787. Go to
Sources → Add a source → Microsoft, the first card under Sign in with the provider.
Press Copy beside the redirect URI. On a stock install it reads:
The Console prints localhost rather than 127.0.0.1 on purpose. Microsoft’s portal refuses an
address written as an IP number over http. Both addresses mean the same machine. If you moved the
Console’s port, the Console prints the address that matches. Copy what the Console prints, never
what this page prints.
Why the redirect URI must come from your own ConsoleBack in Entra, paste it into the field beside the platform. Never type it.The platform now holds one redirect URI, which ends /api/oauth/microsoft/callback.
4
Register the app and copy the client ID
Submit the registration form. Entra registers the app and opens a page for it.That page shows the app’s client ID. Copy it. It is the only value you carry back to the Console.
It is 5 groups of letters and digits, separated by dashes. These zeros stand in for yours:
00000000-0000-0000-0000-000000000000
Change nothing else at Entra. Microsoft needs no client secret. Add no permissions by hand, and
switch on no API. The sign-in screen in the next step is where you grant the scopes.
Why Microsoft needs no client secret
5
Paste the client ID and approve the sign-in
Back in the Console, go to Sources → Add a source → Microsoft.Paste the client ID into the Application (client) ID field. Leave Client secret alone. The
Console disables that box, and it reads not required — public client (PKCE).
The Console's Microsoft card, captured where Microsoft is already connected, so the button reads Reconnect Microsoft. On a first run it reads Save & sign in with Microsoft, with no checkbox above it.
Take the next click only when you have 10 uninterrupted minutes. Press Save & sign in with
Microsoft. Microsoft takes over the tab.Microsoft then asks you to approve four permissions. Postern asks for Mail.Read,
Calendars.Read, Contacts.Read and offline_access — read your mail, read your calendars, read
your contacts, and keep the sign-in alive. Postern asks for nothing else, now or later.Approve all four. Microsoft returns you to the Console’s Sources page, which now holds three
Microsoft connections: mail, calendar and contacts.
The browser shows {"error":"invalid or expired state"}. The 10 minutes ran out, or you
already used this sign-in once. A Postern restart, or a reload of the callback address, also ends
it. Postern stored nothing. Start again from Sources → Add a source → Microsoft.
The Console reads “Microsoft did not complete the sign-in.”, with Microsoft’s own code beneath
it. Microsoft refused the sign-in, and Postern stored nothing. Read the code, correct the
registration at Entra, then press Save & sign in with Microsoft again.
6
Wait for the first sync
On Sources, the three new rows read Awaiting first sync. That is normal. The sign-in creates
the connections; it starts no sync.Postern picks up new connections within about 60 seconds. Each row then reads Syncing…, and then a
Last synced time. Until then, an agent that asks for mail gets an empty answer, not an error.
7
Optional: change how far back mail goes
Postern caches the last 180 days of mail. That is the 6 months setting. To change it, go to
Sources and open the Microsoft mail row. Under Controls, Recency window offers
3 months, 6 months and 12 months. Pick one. The control appears on mail connections
only, and Postern then re-reads the whole window from the start.
8
Optional: reconnect later
To replace the app registration, or to run the consent again, go to Sources → Add a source →
Microsoft. Tick Yes — replace the stored app and re-run consent. The button stays disabled
until you do. Press Reconnect Microsoft. It replaces the stored app and never creates a second
connection.
A dialog headed Register an application blocks the form
Your Microsoft account has no directory yet. Join the M365 Developer Program or sign up for Azure, then register again — Start a new app registration.
Microsoft asks you to sign in again every day
Your app is on Single-page application (SPA). In Entra, move it to Public client/native (mobile & desktop), and add the redirect URI there — Add the redirect URI under the desktop platform.
Microsoft refuses the sign-in for a personal Outlook or Hotmail address
Microsoft shows an error of its own, and the browser never returns to the Console
The registration does not hold the address Postern sends. In the Console, press Copy beside the redirect URI. Paste it into Entra over the old value — Add the redirect URI under the desktop platform.
The Console reads Microsoft did not complete the sign-in.
Microsoft refused the sign-in, and Postern stored nothing. Read Microsoft’s code under that line, correct the registration, then sign in again — Paste the client ID and approve the sign-in.
Fewer than three connections after a consent that looked successful
Inbox and Sent — who sent it, the subject, the preview line, the dates, and the read and attachment flags. Postern never stores the message text. An agent that asks for one message pulls the body from Microsoft on demand, and Postern stores it nowhere.
180 days; Recency window sets 3, 6 or 12 months
Calendar
Your events
365 days back, 365 days forward
Contacts
Your default contacts folder
all of it
None of the three can write. The connector carries no actions. No agent can send mail, change
an event, or add a contact through Postern.
Postern checks Microsoft every 5 minutes. That is also the fastest it will go. Poll cadence
on a connection’s page only offers slower settings.
The app registration stays yours at Entra. Microsoft keeps the sign-in alive as long as
Postern uses it once every 90 days.
Point a client at the MCP endpoint with a key you created. Local clients paste one config block;
claude.ai and ChatGPT need a public address first.
Connect WHOOP
a WHOOP membership + a free dev app · about 10 minutes · confidential client
{"docsConfig":{"theme":"sequoia","$schema":"https://mintlify.com/docs.json","name":"Postern","colors":{"primary":"#E7A42A","light":"#E7A42A","dark":"#B83E15"},"favicon":"https://mintcdn.com/postern/L5OSSMQX3JjXD-Ob/favicon.svg?fit=max\u0026auto=format\u0026n=L5OSSMQX3JjXD-Ob\u0026q=85\u0026s=acbbe5732970fc6bf76b003f012843f1","appearance":{"default":"light","strict":false},"background":{"color":{"light":"#F5EDDA","dark":"#151F19"}},"navbar":{"links":[{"href":"https://getpostern.com","label":"getpostern.com"}],"primary":{"type":"github","href":"https://github.com/getpostern/postern"}},"footer":{"socials":{"website":"https://getpostern.com","github":"https://github.com/getpostern/postern"}},"fonts":{"heading":{"family":"Cormorant Garamond","source":"fonts/cormorant-garamond-var.woff2","format":"woff2"},"body":{"family":"Source Serif 4","source":"fonts/source-serif-4-var.woff2","format":"woff2"}},"styling":{"codeblocks":"system","latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"postern","hasAudioNarration":false,"actualSubdomain":"postern","customDomains":["docs.getpostern.com"],"gitSource":{"type":"github","owner":"getpostern","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a77bc437948e45f24bff423","collectionId":"465e71f9-edfd-4e92-a7b2-36446667a983","liveDeploymentHistoryId":"6a77bc437948e45f24bff423","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aea219dcf56d9cceaaf5561:success","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"Reference","count":15},{"language":"default","tag":"Connect a source","count":9},{"language":"default","tag":"Start here","count":6},{"language":"default","tag":"MCP tools","count":5},{"language":"default","tag":"Security","count":4},{"language":"default","tag":"Mail, calendar \u0026 contacts","count":3},{"language":"default","tag":"Agents, keys and grants","count":3},{"language":"default","tag":"The record","count":3},{"language":"default","tag":"Health","count":2},{"language":"default","tag":"Money","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@font-face{font-family:\"Courier Prime\";src:url(\"/fonts/courier-prime-400.woff2\") format(\"woff2\");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:\"Courier Prime\";src:url(\"/fonts/courier-prime-700.woff2\") format(\"woff2\");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:\"Cormorant Garamond\";src:url(\"/fonts/cormorant-garamond-marks.woff2\") format(\"woff2\");font-weight:300 700;font-style:normal;font-display:swap;unicode-range:U+2116, U+2190-2192}@font-face{font-family:\"Cormorant Garamond\";src:url(\"/fonts/cormorant-garamond-italic-marks.woff2\") format(\"woff2\");font-weight:300 700;font-style:italic;font-display:swap;unicode-range:U+2116, U+2190-2192}@font-face{font-family:\"EB Garamond\";src:url(\"/fonts/eb-garamond-marks.woff2\") format(\"woff2\");font-weight:400 800;font-style:normal;font-display:swap;unicode-range:U+2116, U+2190-2192}@font-face{font-family:\"EB Garamond\";src:url(\"/fonts/eb-garamond-italic-marks.woff2\") format(\"woff2\");font-weight:400 800;font-style:italic;font-display:swap;unicode-range:U+2116, U+2190-2192}@font-face{font-family:\"Cormorant Garamond\";src:url(\"/fonts/cormorant-garamond-500-italic.woff2\") format(\"woff2\");font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:\"EB Garamond\";src:url(\"/fonts/eb-garamond-400-italic.woff2\") format(\"woff2\");font-weight:400;font-style:italic;font-display:swap}code,pre,kbd,samp,code span,pre span{font-family:\"Courier Prime\", \"Courier New\", ui-monospace, Menlo, Consolas,\n \"DejaVu Sans Mono\", monospace}@font-face{font-family:\"Source Serif 4\";src:url(\"/fonts/source-serif-4-var.woff2\") format(\"woff2\");font-weight:400 700;font-style:normal;font-display:swap}@font-face{font-family:\"Source Serif 4\";src:url(\"/fonts/source-serif-4-italic-var.woff2\") format(\"woff2\");font-weight:400 700;font-style:italic;font-display:swap}:root{--postern-body: \"Source Serif 4\", \"EB Garamond\", Georgia, serif;--postern-measure: 74ch}#content-area p,#content-area li,#content-area td,#content-area th,#content-area blockquote{font-family:var(--postern-body);font-size:17px;line-height:1.7}#content-area p,#content-area ul,#content-area ol,#content-area blockquote{max-width:var(--postern-measure)}#content-area h2{margin-top:2.75em;margin-bottom:0.6em;letter-spacing:-0.01em}#content-area h3{margin-top:2em;margin-bottom:0.5em}#content-area h2+p,#content-area h3+p{margin-top:0}#content-area table{font-size:15.5px;line-height:1.55}#content-area th{font-size:13px;letter-spacing:0.06em;text-transform:uppercase;opacity:0.72}#content-area td,#content-area th{padding-top:0.6em;padding-bottom:0.6em;vertical-align:baseline}#content-area .prose>table,#content-area table{display:block;overflow-x:auto;max-width:100%}#content-area .callout,#content-area [class*=\"callout\"]{border-width:1px;border-radius:3px}#content-area .callout p,#content-area [class*=\"callout\"] p{font-size:16px;line-height:1.65;max-width:none}#content-area p code,#content-area li code,#content-area td code{font-size:0.94em;padding:0.1em 0.32em;border-radius:2px}#content-area p strong,#content-area li strong,#content-area td strong{font-weight:600;color:var(--postern-strong, inherit)}#content-area h2:has(+p){text-wrap:balance}@media (max-width: 900px){#content-area p,#content-area li,#content-area td,#content-area th,#content-area blockquote{font-size:16px}#content-area h2{margin-top:2.25em}}"}],"page":{"pagePath":"connect/microsoft","slug":"/connect/microsoft","pageMetadata":{"title":"Connect Microsoft","description":"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.","href":"/connect/microsoft"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CodeBlock,Columns,Frame,Heading,Info,Note,OptimizedImage,Step,Steps,Table,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Columns)_missingMdxReference(`Columns`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(Info,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Before you start`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A Microsoft account`}),` — personal, work or school. Postern reads the mail, calendar and\ncontacts of the account you sign in with.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Postern installed and started, with the Console open at `,_jsx(_components.code,{children:`http://127.0.0.1:8787`}),`.`]}),` The Console\nopens only on the machine Postern runs on. If Postern runs on a NAS or another machine, open the\nConsole from your own computer over SSH first:\n`,_jsx(_components.a,{href:`/start/remote-access#ssh-tunnel`,children:`Open the Console over SSH`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`About 15 minutes, in two browser tabs`}),` — Entra in one, the Console in the other. You go back\nand forth three times. One of those moves interrupts a half-filled Entra form, so leave that tab\nopen.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`10 uninterrupted minutes for the last step.`}),` Postern holds the sign-in open for 10 minutes\nand cannot pause it.`]}),`\n`]})]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Start a new app registration`,titleSize:`h2`,id:`register`,children:[_jsxs(_components.p,{children:[`At `,_jsx(_components.a,{href:`https://entra.microsoft.com`,children:`entra.microsoft.com`}),`, sign in with the account whose mail, calendar\nand contacts you want. You register your own app. Postern ships no shared one.`]}),_jsxs(_components.p,{children:[`The portal’s masthead reads `,_jsx(_components.strong,{children:`Microsoft Entra admin center`}),`. In the left rail, open `,_jsx(_components.strong,{children:`Entra ID`}),`,\nthen `,_jsx(_components.strong,{children:`App registrations`}),`.`]}),_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`App registrations`}),` page, an account with no apps yet shows `,_jsx(_components.strong,{children:`There are no applications\nhere.`}),` Press `,_jsx(_components.strong,{children:`+ New registration`}),`. The registration form opens.`]}),_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Name`}),`, type `,_jsx(_components.code,{children:`Postern`}),`. Entra’s helper under that box reads “The user-facing display name for\nthis application (this can be changed later).”`]}),_jsx(_components.p,{children:`Do not submit the registration form yet. The next two steps fill in the rest of it.`}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`A dialog headed Register an application opens instead of the form.`}),` It reads: “The ability to\ncreate applications outside of a directory has been deprecated. You may get a new directory by\njoining the M365 Developer Program or signing up for Azure.” Its only button is `,_jsx(_components.strong,{children:`Cancel`}),`, and\nthe same words sit in an amber bar across the page. Your Microsoft account has no directory yet.\nTake `,_jsx(_components.strong,{children:`joining the M365 Developer Program`}),` or `,_jsx(_components.strong,{children:`signing up for Azure`}),`. Finish that sign-up. Then\ncome back and press `,_jsx(_components.strong,{children:`+ New registration`}),` again. That is expected, not a wrong turn.`]})})]}),_jsxs(Step,{title:`Choose the account type that covers personal accounts`,titleSize:`h2`,id:`account-types`,children:[_jsxs(_components.p,{children:[`In the same form, find `,_jsx(_components.strong,{children:`Supported account types`}),`. Entra prints “Choose the account types that can\nuse this application or access this API” beneath it.`]}),_jsx(_components.p,{children:`Open the dropdown and choose this row:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Any Entra ID Tenant + Personal Microsoft accounts`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`The dropdown opens on `,_jsx(_components.strong,{children:`Single tenant only - Default Directory`}),`. An app left on that row refuses a\npersonal Outlook or Hotmail sign-in.\n`,_jsx(_components.a,{href:`/reference/provider-sign-ins#two-microsoft-registration-choices-postern-cannot-work-around`,children:`Why the default choice locks out personal accounts`})]}),_jsx(Frame,{caption:`The dropdown opens on Single tenant only - Default Directory. Take Any Entra ID Tenant + Personal Microsoft accounts.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-account-types.png?fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=5b4c433aa720c7e7553a59a1287c9276`,alt:`The Entra New registration form: a Name field that holds 'postern', and the Supported account types dropdown open — Single tenant only - Default Directory as the current value, then Multiple Entra ID tenants, then Any Entra ID Tenant + Personal Microsoft accounts.`,\"data-og-width\":`1032`,width:`1032`,\"data-og-height\":`620`,height:`620`,\"data-path\":`images/microsoft-account-types.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-account-types.png?w=280\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=244348bfe55e90e40cbdd178add231ff 280w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-account-types.png?w=560\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=9607cd2476a6b6a7dd5d773320a9e434 560w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-account-types.png?w=840\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=6e61ad22a12d9c2bba75952d40ceabc1 840w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-account-types.png?w=1100\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=6540d6796e6854cd82d6b706ad8a313b 1100w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-account-types.png?w=1650\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=f5eb7856719d46389ac52720e103c642 1650w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-account-types.png?w=2500\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=7a2120694de340d10aee71dc01c3b12d 2500w`})})]}),_jsxs(Step,{title:`Add the redirect URI under the desktop platform`,titleSize:`h2`,id:`redirect-uri`,children:[_jsx(Warning,{children:_jsxs(_components.p,{children:[`Do not choose `,_jsx(_components.strong,{children:`Single-page application (SPA)`}),`. Microsoft caps that platform’s sign-in at 24\nhours, so you would sign in again every day, and no Postern setting changes that. Choose\n`,_jsx(_components.strong,{children:`Public client/native (mobile \u0026 desktop)`}),`.`]})}),_jsxs(_components.p,{children:[`Lower in the same form, open `,_jsx(_components.strong,{children:`Select a platform`}),` and choose `,_jsx(_components.strong,{children:`Public client/native (mobile \u0026\ndesktop)`}),`.`]}),_jsx(Frame,{caption:`Take Public client/native (mobile \u0026 desktop). Single-page application (SPA) costs you a sign-in every day.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-redirect.png?fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=ab61efac9999028424c60483e378040a`,alt:`The Entra platform dropdown, open, with the label 'Select a platform' and three choices beneath it: Public client/native (mobile \u0026 desktop), Web, and Single-page application (SPA).`,\"data-og-width\":`512`,width:`512`,\"data-og-height\":`294`,height:`294`,\"data-path\":`images/microsoft-redirect.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-redirect.png?w=280\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=c304e47474e2c645d03ced8553397ada 280w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-redirect.png?w=560\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=c2d67e745c6d48ed4f80e4e3b1e155b2 560w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-redirect.png?w=840\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=d0df1262ad6c309ed317fd988d023831 840w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-redirect.png?w=1100\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=86005b95dea791141761a4227da6a753 1100w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-redirect.png?w=1650\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=af5c988d77367303145f6a4ae1b85530 1650w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-redirect.png?w=2500\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=e4336baabb071e5f42a05d8a62b32181 2500w`})}),_jsx(_components.p,{children:`A redirect URI is the address Microsoft sends you back to after you approve. Microsoft matches it\nexactly, character for character.`}),_jsxs(_components.p,{children:[`Leave the Entra tab open. In your second tab, open the Console at `,_jsx(_components.code,{children:`http://127.0.0.1:8787`}),`. Go to\n`,_jsx(_components.strong,{children:`Sources`}),` → `,_jsx(_components.strong,{children:`Add a source`}),` → `,_jsx(_components.strong,{children:`Microsoft`}),`, the first card under `,_jsx(_components.strong,{children:`Sign in with the provider`}),`.\nPress `,_jsx(_components.strong,{children:`Copy`}),` beside the redirect URI. On a stock install it reads:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`http://localhost:8787/api/oauth/microsoft/callback`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`The Console prints `,_jsx(_components.code,{children:`localhost`}),` rather than `,_jsx(_components.code,{children:`127.0.0.1`}),` on purpose. Microsoft’s portal refuses an\naddress written as an IP number over `,_jsx(_components.code,{children:`http`}),`. Both addresses mean the same machine. If you moved the\nConsole’s port, the Console prints the address that matches. Copy what the Console prints, never\nwhat this page prints.\n`,_jsx(_components.a,{href:`/reference/provider-sign-ins#the-redirect-address-is-pinned-inside-postern`,children:`Why the redirect URI must come from your own Console`})]}),_jsx(_components.p,{children:`Back in Entra, paste it into the field beside the platform. Never type it.`}),_jsxs(_components.p,{children:[`The platform now holds one redirect URI, which ends `,_jsx(_components.code,{children:`/api/oauth/microsoft/callback`}),`.`]})]}),_jsxs(Step,{title:`Register the app and copy the client ID`,titleSize:`h2`,id:`client-id`,children:[_jsx(_components.p,{children:`Submit the registration form. Entra registers the app and opens a page for it.`}),_jsx(_components.p,{children:`That page shows the app’s client ID. Copy it. It is the only value you carry back to the Console.\nIt is 5 groups of letters and digits, separated by dashes. These zeros stand in for yours:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`00000000-0000-0000-0000-000000000000`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`Change nothing else at Entra. Microsoft needs no client secret. Add no permissions by hand, and\nswitch on no API. The sign-in screen in the next step is where you grant the scopes.\n`,_jsx(_components.a,{href:`/reference/provider-sign-ins#what-each-provider-needs-and-why`,children:`Why Microsoft needs no client secret`})]})]}),_jsxs(Step,{title:`Paste the client ID and approve the sign-in`,titleSize:`h2`,id:`console-consent`,children:[_jsxs(_components.p,{children:[`Back in the Console, go to `,_jsx(_components.strong,{children:`Sources`}),` → `,_jsx(_components.strong,{children:`Add a source`}),` → `,_jsx(_components.strong,{children:`Microsoft`}),`.`]}),_jsxs(_components.p,{children:[`Paste the client ID into the `,_jsx(_components.strong,{children:`Application (client) ID`}),` field. Leave `,_jsx(_components.strong,{children:`Client secret`}),` alone. The\nConsole disables that box, and it reads `,_jsx(_components.code,{children:`not required — public client (PKCE)`}),`.`]}),_jsx(Frame,{caption:`The Console's Microsoft card, captured where Microsoft is already connected, so the button reads Reconnect Microsoft. On a first run it reads Save \u0026 sign in with Microsoft, with no checkbox above it.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-console-card.png?fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=c4fa402272c59a6b7574def4805ff922`,alt:`The Console's Microsoft card. Left: the three registration steps and the copyable redirect URI http://localhost:8787/api/oauth/microsoft/callback, under a note that Microsoft is a public client and no secret is stored. Right: an Application (client) ID field, a disabled Client secret field that reads 'not required — public client (PKCE)', and mail, calendar and contacts chips under the line 'from this one consent'.`,\"data-og-width\":`1210`,width:`1210`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/microsoft-console-card.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-console-card.png?w=280\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=5f966cb03b8789130f277d92c7868585 280w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-console-card.png?w=560\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=d526328eabaa5de16eeff5e88ee038d8 560w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-console-card.png?w=840\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=020e15017414394501b9dd9fbbd01040 840w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-console-card.png?w=1100\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=b2849fde834e8fd5107766c0710b77de 1100w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-console-card.png?w=1650\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=a17e33a4ef725edd93b511370ef61f57 1650w, https://mintcdn.com/postern/E8R3wfogdGSukifu/images/microsoft-console-card.png?w=2500\u0026fit=max\u0026auto=format\u0026n=E8R3wfogdGSukifu\u0026q=85\u0026s=b8930010f0a9dd66a280feaf54239277 2500w`})}),_jsxs(_components.p,{children:[`Take the next click only when you have 10 uninterrupted minutes. Press `,_jsx(_components.strong,{children:`Save \u0026 sign in with\nMicrosoft`}),`. Microsoft takes over the tab.`]}),_jsxs(_components.p,{children:[`Microsoft then asks you to approve four permissions. Postern asks for `,_jsx(_components.code,{children:`Mail.Read`}),`,\n`,_jsx(_components.code,{children:`Calendars.Read`}),`, `,_jsx(_components.code,{children:`Contacts.Read`}),` and `,_jsx(_components.code,{children:`offline_access`}),` — read your mail, read your calendars, read\nyour contacts, and keep the sign-in alive. Postern asks for nothing else, now or later.`]}),_jsxs(_components.p,{children:[`Approve all four. Microsoft returns you to the Console’s `,_jsx(_components.strong,{children:`Sources`}),` page, which now holds three\nMicrosoft connections: mail, calendar and contacts.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`The browser shows `,_jsx(_components.code,{children:`{\"error\":\"invalid or expired state\"}`}),`.`]}),` The 10 minutes ran out, or you\nalready used this sign-in once. A Postern restart, or a reload of the callback address, also ends\nit. Postern stored nothing. Start again from `,_jsx(_components.strong,{children:`Sources`}),` → `,_jsx(_components.strong,{children:`Add a source`}),` → `,_jsx(_components.strong,{children:`Microsoft`}),`.`]})}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The Console reads “Microsoft did not complete the sign-in.”, with Microsoft’s own code beneath\nit.`}),` Microsoft refused the sign-in, and Postern stored nothing. Read the code, correct the\nregistration at Entra, then press `,_jsx(_components.strong,{children:`Save \u0026 sign in with Microsoft`}),` again.`]})})]}),_jsxs(Step,{title:`Wait for the first sync`,titleSize:`h2`,id:`first-sync`,children:[_jsxs(_components.p,{children:[`On `,_jsx(_components.strong,{children:`Sources`}),`, the three new rows read `,_jsx(_components.code,{children:`Awaiting first sync`}),`. That is normal. The sign-in creates\nthe connections; it starts no sync.`]}),_jsxs(_components.p,{children:[`Postern picks up new connections within about 60 seconds. Each row then reads `,_jsx(_components.code,{children:`Syncing…`}),`, and then a\n`,_jsx(_components.code,{children:`Last synced`}),` time. Until then, an agent that asks for mail gets an empty answer, not an error.`]})]}),_jsx(Step,{title:`Optional: change how far back mail goes`,titleSize:`h2`,id:`recency`,children:_jsxs(_components.p,{children:[`Postern caches the last 180 days of mail. That is the `,_jsx(_components.strong,{children:`6 months`}),` setting. To change it, go to\n`,_jsx(_components.strong,{children:`Sources`}),` and open the Microsoft mail row. Under `,_jsx(_components.strong,{children:`Controls`}),`, `,_jsx(_components.strong,{children:`Recency window`}),` offers\n`,_jsx(_components.strong,{children:`3 months`}),`, `,_jsx(_components.strong,{children:`6 months`}),` and `,_jsx(_components.strong,{children:`12 months`}),`. Pick one. The control appears on mail connections\nonly, and Postern then re-reads the whole window from the start.`]})}),_jsx(Step,{title:`Optional: reconnect later`,titleSize:`h2`,id:`reconnect`,children:_jsxs(_components.p,{children:[`To replace the app registration, or to run the consent again, go to `,_jsx(_components.strong,{children:`Sources`}),` → `,_jsx(_components.strong,{children:`Add a source`}),` →\n`,_jsx(_components.strong,{children:`Microsoft`}),`. Tick `,_jsx(_components.strong,{children:`Yes — replace the stored app and re-run consent.`}),` The button stays disabled\nuntil you do. Press `,_jsx(_components.strong,{children:`Reconnect Microsoft`}),`. It replaces the stored app and never creates a second\nconnection.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`confirm-it-works`,children:`Confirm it works`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`In Entra, your app’s platform reads `,_jsx(_components.strong,{children:`Public client/native (mobile \u0026 desktop)`}),`, not\n`,_jsx(_components.strong,{children:`Single-page application (SPA)`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The Console’s `,_jsx(_components.strong,{children:`Application (client) ID`}),` field holds the same value Entra shows on your app’s own\npage.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Sources`}),` shows three Microsoft connections — mail, calendar and contacts — each with a\n`,_jsx(_components.code,{children:`Last synced`}),` time.`]}),`\n`,_jsxs(_components.li,{children:[`The Console’s `,_jsx(_components.strong,{children:`Client secret`}),` field is empty and reads `,_jsx(_components.code,{children:`not required — public client (PKCE)`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`if-something-went-wrong`,children:`If something went wrong`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`What you see`}),_jsx(_components.th,{children:`What to do`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`A dialog headed `,_jsx(_components.strong,{children:`Register an application`}),` blocks the form`]}),_jsxs(_components.td,{children:[`Your Microsoft account has no directory yet. Join the M365 Developer Program or sign up for Azure, then register again — `,_jsx(_components.a,{href:`#register`,children:`Start a new app registration`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Microsoft asks you to sign in again every day`}),_jsxs(_components.td,{children:[`Your app is on `,_jsx(_components.strong,{children:`Single-page application (SPA)`}),`. In Entra, move it to `,_jsx(_components.strong,{children:`Public client/native (mobile \u0026 desktop)`}),`, and add the redirect URI there — `,_jsx(_components.a,{href:`#redirect-uri`,children:`Add the redirect URI under the desktop platform`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Microsoft refuses the sign-in for a personal Outlook or Hotmail address`}),_jsxs(_components.td,{children:[`Your app is on `,_jsx(_components.strong,{children:`Single tenant only - Default Directory`}),`. Set `,_jsx(_components.strong,{children:`Supported account types`}),` to `,_jsx(_components.strong,{children:`Any Entra ID Tenant + Personal Microsoft accounts`}),` — `,_jsx(_components.a,{href:`#account-types`,children:`Choose the account type that covers personal accounts`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Microsoft shows an error of its own, and the browser never returns to the Console`}),_jsxs(_components.td,{children:[`The registration does not hold the address Postern sends. In the Console, press `,_jsx(_components.strong,{children:`Copy`}),` beside the redirect URI. Paste it into Entra over the old value — `,_jsx(_components.a,{href:`#redirect-uri`,children:`Add the redirect URI under the desktop platform`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`{\"error\":\"invalid or expired state\"}`})}),_jsxs(_components.td,{children:[`The 10 minutes ran out, or you used the sign-in twice. Postern stored nothing. Start the sign-in again — `,_jsx(_components.a,{href:`#console-consent`,children:`Paste the client ID and approve the sign-in`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The Console reads `,_jsx(_components.strong,{children:`Microsoft did not complete the sign-in.`})]}),_jsxs(_components.td,{children:[`Microsoft refused the sign-in, and Postern stored nothing. Read Microsoft’s code under that line, correct the registration, then sign in again — `,_jsx(_components.a,{href:`#console-consent`,children:`Paste the client ID and approve the sign-in`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Fewer than three connections after a consent that looked successful`}),_jsxs(_components.td,{children:[`The consent granted fewer than four permissions. Press `,_jsx(_components.strong,{children:`Save \u0026 sign in with Microsoft`}),` again and approve all four — `,_jsx(_components.a,{href:`#console-consent`,children:`Paste the client ID and approve the sign-in`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The three rows still read `,_jsx(_components.code,{children:`Awaiting first sync`})]}),_jsxs(_components.td,{children:[`Postern picks up new connections within about 60 seconds. Reload `,_jsx(_components.strong,{children:`Sources`}),` — `,_jsx(_components.a,{href:`#first-sync`,children:`Wait for the first sync`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`what-you-have-now`,children:`What you have now`}),`\n`,_jsx(_components.p,{children:`Three read-only connections out of one consent.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Connection`}),_jsx(_components.th,{children:`What Postern stores`}),_jsx(_components.th,{children:`How far back`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Mail`}),_jsx(_components.td,{children:`Inbox and Sent — who sent it, the subject, the preview line, the dates, and the read and attachment flags. Postern never stores the message text. An agent that asks for one message pulls the body from Microsoft on demand, and Postern stores it nowhere.`}),_jsxs(_components.td,{children:[`180 days; `,_jsx(_components.strong,{children:`Recency window`}),` sets 3, 6 or 12 months`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Calendar`}),_jsx(_components.td,{children:`Your events`}),_jsx(_components.td,{children:`365 days back, 365 days forward`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Contacts`}),_jsx(_components.td,{children:`Your default contacts folder`}),_jsx(_components.td,{children:`all of it`})]})]})]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`None of the three can write.`}),` The connector carries no actions. No agent can send mail, change\nan event, or add a contact through Postern.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Postern checks Microsoft every 5 minutes.`}),` That is also the fastest it will go. `,_jsx(_components.strong,{children:`Poll cadence`}),`\non a connection’s page only offers slower settings.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The app registration stays yours at Entra.`}),` Microsoft keeps the sign-in alive as long as\nPostern uses it once every 90 days.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Postern never held a Microsoft password.`}),` Revoke an agent, or disconnect Microsoft in the\nConsole, and neither one can touch a password you never pasted.\n`,_jsx(_components.a,{href:`/reference/grants-and-sectors#what-a-grant-covers`,children:`What a grant covers`}),`, and\n`,_jsx(_components.a,{href:`/reference/agent-keys#what-a-revoke-does-not-touch`,children:`what you take back when you revoke one`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`next`,children:`Next`}),`\n`,_jsxs(Columns,{cols:2,children:[_jsx(Card,{title:`Connect an agent`,href:`/start/connect-an-agent`,children:_jsx(_components.p,{children:`Point a client at the MCP endpoint with a key you created. Local clients paste one config block;\nclaude.ai and ChatGPT need a public address first.`})}),_jsx(Card,{title:`Connect WHOOP`,href:`/connect/whoop`,children:_jsx(_components.p,{children:`a WHOOP membership + a free dev app · about 10 minutes · confidential client`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Connect Microsoft","description":"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.","href":"/connect/microsoft"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Start a new app registration","slug":"register","depth":2,"children":[]},{"title":"Choose the account type that covers personal accounts","slug":"account-types","depth":2,"children":[]},{"title":"Add the redirect URI under the desktop platform","slug":"redirect-uri","depth":2,"children":[]},{"title":"Register the app and copy the client ID","slug":"client-id","depth":2,"children":[]},{"title":"Paste the client ID and approve the sign-in","slug":"console-consent","depth":2,"children":[]},{"title":"Wait for the first sync","slug":"first-sync","depth":2,"children":[]},{"title":"Optional: change how far back mail goes","slug":"recency","depth":2,"children":[]},{"title":"Optional: reconnect later","slug":"reconnect","depth":2,"children":[]},{"title":"Confirm it works","slug":"confirm-it-works","depth":2,"children":[]},{"title":"If something went wrong","slug":"if-something-went-wrong","depth":2,"children":[]},{"title":"What you have now","slug":"what-you-have-now","depth":2,"children":[]},{"title":"Next","slug":"next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"postern","siteName":"Postern","title":"Connect Microsoft - Postern","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-07T18:52:32.617Z","originalFileLocation":"connect/microsoft.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Postern\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Connect Microsoft - Postern\">\u003cmeta data-mint-head property=\"og:description\" content=\"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Postern\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.getpostern.com/connect/microsoft\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://postern.mintlify.site/_mintlify/api/og/v2?division=Mail%2C+calendar+%26+contacts\u0026amp;title=Connect+Microsoft\u0026amp;description=Register+your+own+app+at+Microsoft%2C+approve+one+consent%2C+and+get+three+read-only+connections%3A+Outlook+mail%2C+calendar+and+contacts.\u0026amp;theme=4d380beff7db0b8a6a5f24a8\u0026amp;signature=4d023ca4a4f1e2deeb3bd4362305af23ac56288328332e17bbda46e176b61fc7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Connect Microsoft - Postern\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://postern.mintlify.site/_mintlify/api/og/v2?division=Mail%2C+calendar+%26+contacts\u0026amp;title=Connect+Microsoft\u0026amp;description=Register+your+own+app+at+Microsoft%2C+approve+one+consent%2C+and+get+three+read-only+connections%3A+Outlook+mail%2C+calendar+and+contacts.\u0026amp;theme=4d380beff7db0b8a6a5f24a8\u0026amp;signature=4d023ca4a4f1e2deeb3bd4362305af23ac56288328332e17bbda46e176b61fc7\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/postern/qaGaM2kl3nxvvGFE/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Postern\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#E7A42A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.getpostern.com/connect/microsoft\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/connect/microsoft.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.getpostern.com/#organization\",\"name\":\"Postern\",\"url\":\"https://docs.getpostern.com\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.getpostern.com#website\",\"name\":\"Postern\",\"url\":\"https://docs.getpostern.com\",\"publisher\":{\"@id\":\"https://docs.getpostern.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.getpostern.com/connect/microsoft#webpage\",\"url\":\"https://docs.getpostern.com/connect/microsoft\",\"name\":\"Connect Microsoft\",\"description\":\"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.\",\"dateModified\":\"2026-08-07T18:52:32.617Z\",\"isPartOf\":{\"@id\":\"https://docs.getpostern.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.getpostern.com/connect/microsoft#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.getpostern.com/connect/microsoft#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Connect a source\",\"item\":\"https://docs.getpostern.com/connect/simplefin\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mail, calendar \u0026 contacts\",\"item\":\"https://docs.getpostern.com/connect/google\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Connect Microsoft\",\"item\":\"https://docs.getpostern.com/connect/microsoft\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.getpostern.com/connect/microsoft#article\",\"headline\":\"Connect Microsoft\",\"name\":\"Connect Microsoft\",\"description\":\"Register your own app at Microsoft, approve one consent, and get three read-only connections: Outlook mail, calendar and contacts.\",\"url\":\"https://docs.getpostern.com/connect/microsoft\",\"mainEntityOfPage\":{\"@id\":\"https://docs.getpostern.com/connect/microsoft#webpage\"},\"dateModified\":\"2026-08-07T18:52:32.617Z\",\"publisher\":{\"@id\":\"https://docs.getpostern.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.getpostern.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Postern\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Postern","nav":{"global":null,"groups":[{"group":"Start here","pages":[{"title":"Postern","href":"/index"},{"title":"Install Postern","href":"/start/install"},{"title":"Set up remote access","href":"/start/remote-access"},{"title":"Mint your first key","href":"/start/first-key"},{"title":"Connect an agent","href":"/start/connect-an-agent"},{"title":"Set up with an agent","href":"/start/set-up-with-an-agent"}]},{"group":"Connect a source","pages":[{"group":"Money","pages":[{"title":"Connect SimpleFIN","href":"/connect/simplefin"},{"title":"Connect Plaid","href":"/connect/plaid"}]},{"group":"Health","pages":[{"title":"Connect Apple Health","href":"/connect/apple-health"},{"title":"Connect WHOOP","href":"/connect/whoop"}]},{"group":"Mail, calendar \u0026 contacts","pages":[{"title":"Connect Google and Gmail","description":"Gmail with an app password. Calendar and contacts with your own Google Cloud app. The two parts are independent — do either one, or both.","href":"/connect/google"},{"title":"Connect Microsoft","href":"/connect/microsoft"},{"title":"Connect iCloud","description":"One app-specific password from Apple gives Postern three read-only connections: mail, calendar and contacts.","href":"/connect/icloud"}]},{"group":"Home","pages":[{"title":"Connect Home Assistant","href":"/connect/home-assistant"}]},{"group":"Agents","pages":[{"title":"Connect ChatGPT","href":"/connect/chatgpt"}]}]},{"group":"Operate","pages":[{"title":"Back up, export and erase","href":"/operate/backup-and-export"}]},{"group":"Reference","pages":[{"group":"Security","pages":[{"title":"Security model","href":"/reference/security-model"},{"title":"Which computers can reach Postern","href":"/reference/ports"},{"title":"The vault and the master key","href":"/reference/vault"},{"title":"Provider sign-ins","href":"/reference/provider-sign-ins"}]},{"group":"Agents, keys and grants","pages":[{"title":"Grants and sectors","href":"/reference/grants-and-sectors"},{"title":"Agent keys: create, expire, revoke, rotate","href":"/reference/agent-keys"},{"title":"Why an agent was refused","href":"/reference/refusals"}]},{"group":"MCP tools","pages":[{"title":"MCP tools","href":"/reference/mcp-primitives"},{"title":"Read data: get_schema, query, get_record","href":"/reference/mcp-reading"},{"title":"Freshness and live reads: describe_context, fetch_live","href":"/reference/mcp-freshness"},{"title":"Act on a source: list_actions, invoke_action","href":"/reference/mcp-actions"},{"title":"The OAuth bridge, for hosted agents","href":"/reference/oauth-bridge"}]},{"group":"The record","pages":[{"title":"The audit log","href":"/reference/audit-log"},{"title":"Read the record","href":"/reference/read-the-record"},{"title":"What the record cannot promise","href":"/reference/record-limits"}]}]},{"group":"About","pages":[{"title":"Frequently asked questions","href":"/about/faq"}]}]},"basePath":"","title":"Connect Microsoft - Postern","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["07c022d89b","a74be98ba7","a9bb46feb3"],"chunks":["Frame-NdetNziF.js","DynamicMarkdown-CD8713Yy.js","zoom-image-lightbox-DMoL6lHz.js","lightbox-handle-r17bVUz3.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}