GraphPaaS in Claude

12 Oct 2026

Ask your Microsoft 365 tenant in Claude

Most questions about a Microsoft 365 tenant are small. Who has a licence and doesn't use it? Which laptops are out of compliance? What should I fix first? Each one usually means a report export, a filter in Excel and a second tab to cross-check names. The GraphPaaS connector for Claude turns them into a sentence: you ask, Claude queries the data your GraphPaaS dashboard already holds, and the answer comes back with the query it came from.

Below is the setup, then four real exchanges with our demo tenant (synthetic users, real tool calls, nothing tidied up), and the limits, stated plainly.

Three steps to connect

1
Add the connector.

In Claude, open Settings → Connectors → Add custom connector. The URL is https://mcp.graphpaas.com/, the root, with no /mcp at the end. Leave the OAuth Client ID and Secret empty: Claude registers itself. On Team and Enterprise, an owner adds it once for everyone.

2
Sign in with Microsoft.

Use the account you use for the dashboard. Claude then reads as you: the same organisation and the same tenants. No GraphPaaS account yet? Sign in to the dashboard once first, or ask your admin to invite you.

3
Ask.

Turn GraphPaaS on in a chat's tools menu and ask in plain language, or start from one of the four ready-made reviews in the same menu (licences, security, device health, executive summary).

WHERE AN ANSWER COMES FROM, AND WHAT NEVER HAPPENS Claude your question becomes a tool call get_metrics(…) mcp.graphpaas.com the dashboard's checks, every call 1 · who you are (Microsoft sign-in) 2 · your tenants, nothing more 3 · several tenants? it asks 4 · your plan's domains Last background sync a snapshot per tenant and per domain; answers say when it was collected Your Microsoft 365 tenant Graph, usage reports, Intune, Entra every 4 hours, daily for daily reports live: storage folders only never writes Your conversation stays with Claude: GraphPaaS only sees the tool calls

"Who has a licence and never uses it?"

The demo organisation can read two tenants, so the first call bounces. That is on purpose: without a tenant, the connector refuses to guess and tells Claude to ask.

You ask

Who has a licence and never uses it?

Claude calls
get_metrics(domain="licence_waste", where={"last_activity": null})
→ 400: you can read 2 tenants — ask the user which one they mean
Claude answers

You can read two tenants: Fabrikam HQ (Demo) and Fabrikam Iberia (Demo). Which one, or all tenants?

Pick Fabrikam HQ, and the same question runs against it.

You ask

Fabrikam HQ.

Claude calls
describe_domain(domain="licence_waste", tenant_id="ce48e256-019f-4f8c-b951-0c52d1d65b8e")
→ 42 rows, refresh: daily
get_metrics(domain="licence_waste", tenant_id="ce48e256-019f-4f8c-b951-0c52d1d65b8e",
            where={"last_activity": null})
→ 5 rows
get_metrics(domain="licence_waste", tenant_id="ce48e256-019f-4f8c-b951-0c52d1d65b8e",
            where={"last_activity": {"<": "2026-07-13"}})
→ 5 rows
Claude answers

10 of the 42 people with a paid licence count as waste on the 90-day rule. Five have no activity Microsoft reports at all: Ana Dias, João Yilmaz, Sofia Dias, Bernardo Yilmaz and Kelly Dias. Five were last active before 13 July; the oldest is Clara Fonseca, on 15 February. All but two hold Microsoft 365 E3 plus EMS E3.

Claude didn't know what "never uses it" means in this data. It asked describe_domain, whose note says the dashboard counts a licence as wasted when the last activity is empty or older than 90 days. That last activity is Microsoft's: the most recent intentional activity in the app, and the usage reports typically arrive 24 to 72 hours late, which is why this domain syncs once a day. The next step is the one in our dormant accounts audit: check each name with their manager before you remove anything.

"Which devices are out of compliance?"

You ask

Which devices are out of compliance, and is anything odd about them?

Claude calls
get_metrics(domain="devices", tenant_id="ce48e256-019f-4f8c-b951-0c52d1d65b8e",
            group_by="compliance_state")
→ compliant 31 · noncompliant 5
get_metrics(domain="devices", tenant_id="ce48e256-019f-4f8c-b951-0c52d1d65b8e",
            where={"compliance_state": "noncompliant"})
→ 5 rows
Claude answers

5 of 36 devices are non-compliant: one iPhone (FBK-IOS-017) and four Windows PCs. FBK-WIN-009 and FBK-WIN-033 still run Windows 10 (build 19045). FBK-WIN-001, Ana Dias's laptop, last checked in with Intune on 16 August.

Intune marks a device non-compliant immediately by default, and Conditional Access can then block it. But two of these five have a problem no setting will fix: Windows 10 stopped receiving security updates after 14 October 2025. Those two need an upgrade or a replacement, not a re-sync.

"What should I fix first?"

You ask

What should I fix first?

Claude calls
tenant_advisor(tenant_id="ce48e256-019f-4f8c-b951-0c52d1d65b8e", status="fail")
→ 19 failing: critical 1 · high 5 · medium 8 · low 5 (17 passing)
Claude answers

Start with the critical one: 2 of 7 admins have no MFA method registered, ana.dias and diego.yilmaz. Then the five high ones: Diego also has an inbox rule forwarding mail to [email protected], 4 of 29 members have no MFA, the 5 non-compliant devices, one unverified app (Mail Sync Pro) holding Mail.ReadWrite and Mail.Send, and 6 of 18 Windows devices on Windows 10.

Read the three answers together

Three separate tools, and one name keeps coming back. Ana Dias holds a paid licence with no activity Microsoft reports, an admin role with no MFA method, and a laptop that hasn't checked in since August. That is what a dormant admin account looks like, and Microsoft's own guidance is blunt about it: accounts with administrative rights are targeted by attackers, and requiring MFA on them is an easy way to cut that risk.

What to do this week
Find out whether Ana still works here. If not, block the sign-in, then remove the role and the licence. If she does, register MFA today. Either way, require MFA for admin roles with a Conditional Access policy, so the next admin can't end up the same way. Then ask Diego about that forwarding rule. Our MFA registration gaps article covers the 4 members without MFA.

What it won't do

  • Write to Microsoft. Every answer comes from data GraphPaaS already collected. The one action, refreshing a single domain, queues another read, and only a tenant admin can run it.
  • Answer live. The background sync runs every four hours, and once a day for what Microsoft publishes once a day. Each answer carries the time its data was collected. Browsing SharePoint and OneDrive folders is the exception: that reads Microsoft live.
  • See more than you do. Claude gets your dashboard's access: the same organisation and the same tenants. Limited to three tenants in Team settings? So is Claude. Someone removed from your team loses access on their next call.
  • Pick a tenant for you. With more than one, it asks, as the first exchange above shows.

Claude Code and other MCP clients that send a header can use a GraphPaaS API key instead of the Microsoft sign-in.

Sources
GraphPaaS

Ask your own tenant the same three questions, with the access your dashboard already gives you.

Add the connector →

Newsletter

Get the next article by email

Practical M365 & Azure cost pieces like this one. No spam, unsubscribe anytime.