A terminal session reading chats and channels in a home tenant and two client Microsoft Teams tenants through one Carly MCP server

Connect Multiple Teams Accounts to Claude Code

Add every Microsoft Teams account to Carly and one Claude Code session reads all of your tenants at once. Your own company, the client tenant you hold a guest seat in, and the second identity a long engagement gave you, together.

Claude Code’s own route to Teams is the Microsoft 365 connector it inherits from your claude.ai account, and it carries one Microsoft sign-in. The tenant count is therefore a property of the server you register, never a Claude Code setting.

1. Add your Teams accounts to Carly

  1. Sign in at carlyassistant.com.
  2. Open carlyassistant.com/integrations.
  3. Find Microsoft Teams, click Connect, and authorize the account.
  4. Click Connect again for the next one, and repeat for every account you want.

Microsoft reuses the session your browser already holds, so sign out between authorizations or use a separate browser profile, and read the full address on the consent screen before approving. Landing on the same sign-in twice produces a duplicate instead of a second tenant.

A guest seat is its own identity. Signing in as michael@bennettconsulting.com does not carry the guest account a client issued you, so authorize that one separately as well.

On a managed tenant an administrator may need to approve the connection, and each tenant decides on its own, so two clients means two requests worth starting early. Each account keeps its own authorization and its own Teams permissions, and nothing is merged.

Carly connects to thousands of apps, so while you are on that page you can add your inboxes, calendars, files and CRM, and reach them from the same server.

2. Register Carly as an MCP server

Carly is a remote HTTP server, so one command does it:

claude mcp add --transport http --scope user carly https://carlyassistant.com/mcp/

--scope user stores the entry in ~/.claude.json and loads it in every project, which is what you want when the tenants span clients. Leave the flag off and it lands in local scope, visible only in the directory where you added it. --scope project writes a committed .mcp.json for a team.

Then authenticate:

claude mcp login carly

That opens a browser for the OAuth flow. Sign in to the Carly account holding your Teams connections. The /mcp panel runs the same flow, and --no-browser prints a URL instead, which is what you want over SSH.

Confirm it before moving on:

claude mcp list

✔ Connected means you are ready. ! Needs authentication means the browser flow did not finish, and ✘ Failed to connect points at the URL or the network rather than your Carly account.

What one session can do across all your Teams accounts

  • “Check all my Teams accounts for anything about the Adobe rollout since Friday and list who is waiting on me.”
  • Pull the week’s decisions out of internal and client channels together, with the source account stated on every line.
  • Search every tenant for the thread that explains a stalled Databricks migration.
  • Summarize a channel thread in one tenant and post the summary into a channel in another.
  • Read a message and act on it: file the task, reply in the thread, start the workflow it asks for.

Carly reads chats and channels, searches them, posts messages, and acts on what it finds, on every connected account. Separation holds throughout: each identity keeps its own permissions, and every result reports the account it came from.

The routes Claude Code already has to Teams

Three exist, and each one holds a single Microsoft identity.

The first is inherited rather than configured. Sign in with a subscription and Claude Code loads the connectors attached to your claude.ai account. Anthropic’s help article on setting up the Microsoft 365 connector lists Teams read scopes including Chat.Read, Channel.ReadBasic.All and ChannelMessage.Read.All, plus optional write tools that send a chat message, post or reply in a channel, and start a new chat. It also states that the connector requires an Entra tenant on a Microsoft Business plan, that a Microsoft Entra Global Administrator must grant tenant-wide consent before anyone can authenticate, and that personal Microsoft accounts such as @outlook.com and @hotmail.com addresses cannot connect at all.

Two dated defects sit on top of that. An issue opened on the Claude Code GitHub repository on September 8, 2026 and still open reports the Microsoft 365 connector registering in Claude Code with zero tools while working normally in Claude Desktop on the same account, traced to a tengu_mcp_local_oauth_blocked_hosts entry in ~/.claude.json that blocks local OAuth for the connector host. The failure is silent: the connector reads as connected and Teams chat simply is not there. A second issue, filed a week later on Anthropic’s connector repository by a Global Administrator, reports teams_list_teams returning FORBIDDEN: Missing scope 'Team.ReadBasic.All' because the OAuth flow never requests that permission, which blocks channel enumeration even though the channel scopes were granted.

The second route is Microsoft’s own. Work IQ Teams, documented on Microsoft Learn under Agent 365, is read-write CRUD across chats, channels and members, and it is a preview requiring a Microsoft 365 Copilot license for the organization and for every user calling the tools, an Entra app registration consented by an admin, and an endpoint that carries a tenant id in its path. A second tenant is a second server behind a second administrator. Meetings add another gate: since Microsoft began enforcing the EnableGraphTranscriptAccess tenant control on July 29, 2026, Graph access to Teams transcripts is off by default until a Teams administrator turns it on, per tenant.

The third is a community Microsoft Graph server, and Teams is the workload that makes it painful. ChannelMessage.Read.All always requires tenant admin consent, and at least one widely used Graph server requests its whole scope list at once, so a refusal on that one permission fails the sign-in and takes mail and calendar with it. Guest access is harder still: a delegated token is issued in one tenant’s context, cross-tenant chat reads come back 403 AclCheckFailed, and Microsoft’s guidance for on-behalf-of flows with guests is to target that tenant’s id rather than the common authority. Claire Thompson, a guest in two client tenants, is not managing one integration with three logins. She is managing three consent chains owned by administrators she has never met, each revocable without notice.

Per-tenant Teams servers versus Carly in Claude Code

NeedM365 connector or a Graph serverCarly MCP server
Read one tenant’s chats and channelsYes, once consent landsYes
Keep several tenants connected at onceOne identity per connectionOne server, all accounts
Include a guest seat in a client tenantSeparate consent chainYes
Search every tenant in one questionNoYes
Post or reply in a chosen channelOptional write tools, admin gatedYes, within that account’s permissions
Register an Entra app or buy a Copilot licenseUsually requiredNo
Add a fourth tenant laterNew registration and consentNo config change
Keep the work running with the terminal closedNoYes

Carly gives Claude Code one account-aware Teams toolset instead of a stack of tenant-specific applications. Carly offers free Zapier-style workflows; AI agents start at $35/month.

The part that outlives the session

Terminal sessions end. Teams does not. The client question posted at 7pm, the escalation nobody acknowledged, the standup that needs three answers pulled from three companies: all of it recurs, and none of it should wait for a window to be open.

That work belongs in a Carly workflow or a Carly agent, which runs with nothing open and no session attached. Carly treats each connected account as its own trigger source, so a rule can fire on a message in a client’s channel and stay quiet on your internal one.

One detail matters if you want Carly inside a Claude Code routine. Routines run in the cloud against the connectors on your claude.ai account, while a server added locally with claude mcp add lives on your machine, so add Carly at claude.ai/customize/connectors as well, or commit it in .mcp.json. Routines also start from a schedule, a GitHub event or an HTTP call, and each one needs a repository, so none of them notices a message landing in Teams.

Rolling this out across a team with tenant-by-tenant review is available too: book a call.

Quick fixes when a tenant does not appear

ProblemFix
Server shows ! Needs authenticationRun claude mcp login carly and finish the browser flow
Server missing in another projectRe-add with --scope user, or move the entry out of local scope
claude -p reports the tools are unavailableSign in interactively once with /mcp, then rerun the script
The Microsoft 365 connector shows connected but exposes no Teams toolsKnown and open in Claude Code. Register Carly and use its Teams tools instead
The same Microsoft account connected twiceRemove the duplicate, sign out of Microsoft, then authorize the other identity
A client tenant blocks authorizationAsk that tenant’s Entra administrator to approve Carly
A private channel is missingConfirm the connected account is a member of it, then reconnect
Only some accounts answeredAsk for all of them explicitly and require source attribution

Frequently asked questions

Can Claude Code hold two Microsoft Teams tenants natively?

Not on any native path. The Microsoft 365 connector carries one signed-in identity, and a self-hosted Graph server carries the one its app registration was consented for. Connect every account to Carly and register Carly once, and one session works across all of them.

Does my guest seat in a client tenant come along automatically?

No. A guest seat is a separate identity with its own token, and cross-tenant reads fail on a token issued for the wrong tenant. Authorize each identity in Carly and one session covers them together.

Do I need a Copilot license or an Entra app registration?

Not for this route. Carly handles Microsoft authorization on the integrations page, so there is no app registration, no client secret and no Copilot license involved.

Can a session post in Teams as well as read?

Yes. Carly posts messages and acts on what it reads, inside the permissions each connected account already has.

Will this work in a non-interactive run?

Yes, once you have signed in. Claude Code cannot run an OAuth flow during a claude -p run, so complete claude mcp login carly from an interactive session first and the script inherits the stored token.


Related: Multiple Teams accounts in Claude · Multiple Teams accounts in Claude Cowork · Multiple OneDrive accounts in Claude Code · Multiple Slack workspaces in Claude Code · Claude Code MCP · Microsoft Teams MCP · Best AI assistants for multiple Teams accounts · Carly’s Microsoft Teams integration

Ready to automate your busywork?

Carly schedules, researches, and briefs you—so you can focus on what matters.

See what people say

"Before Carly, I relied on a Calendly link, but the whole process felt impersonal and not very professional. Carly changed that by handling all the back-and-forth, so I'm no longer stuck in endless email threads trying to line up schedules.

Now Carly reaches out to candidates, shares my real-time availability, lets them pick a slot, then sends a Zoom link and drops it straight into my calendar. She sends reminders to both of us before each call, which has significantly reduced no-shows and last-minute confusion.

On top of scheduling, Carly acts like a full executive assistant, sending me my schedule the night before so I can prepare for each call. It reminds me of the old x.ai assistant, but Carly is noticeably smarter, faster, and better suited to my healthcare recruitment business."

Gus Ibrahim, Founder & Director, IHR