How to Integrate Claude and Microsoft 365 Tools
"Integrate Claude and Microsoft" usually means one of three things: adding Claude to Microsoft Teams as a bot, calling Claude from Power Automate/Logic Apps flows that already touch SharePoint, Outlook or Dynamics, or wiring Claude into a custom Azure-hosted app. There's no native Microsoft-Claude connector shipped by either company, so every path runs through Claude's API, called from whichever Microsoft surface you're working in.
This guide covers the three integration patterns that actually work, what each one needs in terms of authentication and infrastructure, and how to build a working connection with minimal glue code.
Clarify which "integration" you actually need
Before writing anything, decide which layer you're integrating at:
- Automation layer — you want a Power Automate flow or Logic App to call Claude as one step in a larger workflow (e.g., summarize a SharePoint document, then email the result via Outlook).
- Chat layer — you want Claude reachable inside Microsoft Teams as a bot or app.
- Application layer — you're building a custom .NET, Node, or Python app hosted on Azure that calls Claude directly.
All three need the same underlying piece: an HTTPS endpoint that accepts a prompt and returns a Claude response. The difference is just what calls that endpoint.
Option 1: Power Automate / Logic Apps
Power Automate and Azure Logic Apps both support a generic HTTP action. You don't need a certified connector — a raw HTTP call to a Claude-compatible endpoint works fine as a flow step.
A typical flow: trigger on new file in SharePoint → HTTP POST the file text to Claude → parse the response → write output back to a SharePoint list or send via Outlook.
The HTTP action needs:
- A POST URL
- Headers (
Authorization,Content-Type) - A JSON body with the prompt
{
"model": "claude-sonnet-4-5",
"max_tokens": 500,
"messages": [
{ "role": "user", "content": "Summarize this document: @{triggerBody()?['content']}" }
]
}
If you're calling Claude directly, you need to manage API keys, rate limits, and JSON parsing of the response format yourself, which is more brittle inside a low-code flow than most builders expect. Using an API layer built for exactly this — application keys, predictable JSON, usage tracking — keeps the flow simple. With SubToAPI, the HTTP action just points at https://api.subtoapi.app/v1/messages with a sub_live_... key in the Authorization header, and the response comes back as clean JSON your flow can parse with a standard "Parse JSON" step. See /docs/messages for the exact response shape.
Option 2: Claude inside Microsoft Teams
Teams bots are built on the Bot Framework SDK, which handles the Teams-specific messaging protocol, but the bot's "brain" — what generates the reply — is just an HTTP call you write yourself.
A minimal Node.js Teams bot handler looks like this:
const response = await fetch('https://api.subtoapi.app/v1/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SUBTOAPI_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'claude-sonnet-4-5',
max_tokens: 800,
messages: [{ role: 'user', content: userMessage }]
})
});
const data = await response.json();
await context.sendActivity(data.content[0].text);
You host this alongside your Bot Framework registration (Azure Bot Service or App Service), register it as a Teams app, and it behaves like any other chat bot in a channel or DM. If your bot needs to stream partial responses back to Teams as they generate — useful for long answers — check /docs/streaming; the streaming endpoint returns server-sent events you can pipe into sendActivity updates instead of waiting for the full completion.
Option 3: Custom Azure applications
If you're building a standalone app — an internal tool, a customer-facing product, an Azure Function that processes queued jobs — the integration is just a standard HTTP client call from whatever language your app uses. This is the least constrained path: no Bot Framework, no connector limitations, full control over retries, timeouts, and error handling.
curl https://api.subtoapi.app/v1/messages \
-H "Authorization: Bearer $SUBTOAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Extract line items from this invoice text."}]
}'
Azure Functions, App Service, and AKS all support outbound HTTPS with no special networking config needed — you're just calling an external API like you would any third-party service.
Authentication: keep Microsoft and Claude credentials separate
A common mistake is trying to reuse Azure AD tokens or Microsoft Graph credentials for the Claude call itself. Keep them separate: Azure AD authenticates the user or service principal calling your flow or app; a distinct API key authenticates your app's call to Claude. Store the Claude key in Azure Key Vault (or Power Automate's connection secrets) and reference it at runtime rather than hardcoding it in a flow definition.
If multiple people on your team are building flows or bots that call Claude, a shared dashboard for keys, usage, and per-project limits saves a lot of "who's using the quota" confusion. SubToAPI's Team plan (€19/seat) gives each builder their own sub_live_... key with visibility into usage across the org, which matters once you have five Power Automate flows and two Teams bots all calling the same underlying account. Start with a free trial at /signup, and walk through the first request in /docs/quickstart.
Testing before you wire it into production flows
Test the raw HTTP call outside Power Automate or Teams first. A curl request from your terminal tells you immediately whether the issue is your prompt, your auth header, or the flow's JSON parsing — debugging inside the Power Automate designer is slow and the error messages are vague.
curl https://api.subtoapi.app/v1/messages \
-H "Authorization: Bearer $SUBTOAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-4-5","max_tokens":100,"messages":[{"role":"user","content":"ping"}]}'
Once that returns a clean response, wiring it into a flow, bot, or Azure app is a matter of copying the same headers and body structure into whichever tool you're using.
questions
Does Microsoft offer a native Claude connector for Power Automate? No. There's no certified Claude connector in the Power Automate connector gallery. You use the generic HTTP action with a Claude-compatible API endpoint and key instead.
Can I use Claude inside Microsoft Teams without building a bot? Not directly — Teams doesn't expose a "call any AI model" setting. You need a Bot Framework registration whose backend calls Claude's API, which is a few hours of setup, not a toggle.
Is calling Claude from Azure Functions or App Service reliable for production workloads? Yes, it's a standard outbound HTTPS call like any third-party API integration. Add retry logic for transient failures and set reasonable timeouts, the same as you would for any external dependency.