brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
microsoft-graph-queryingThe RAG query loop for the Microsoft Graph MCP Server for Enterprise — microsoft_graph_suggest_queries to retrieve vetted candidate Graph calls, microsoft_graph_get to execute them, microsoft_graph_list_properties for entity schema — with worked identity and directory examples, result-presentation guidance, and the read-only, RBAC-scoped, rate-limited const…
Independent GitHub snapshot · Automated classification · Original documentation governs
The Microsoft Graph MCP Server for Enterprise is not a raw Graph API passthrough. It is built around a Retrieval-Augmented-Generation (RAG) workflow: you describe what you want, the server hands you vetted candidate API calls from a curated catalog, and you execute the one that fits. Following this loop is the difference between correct answers and made-up endpoints.
Three plugins reach the same Microsoft 365 tenant with near-identical vocabulary. This one answers questions; it cannot change anything.
GET only, so
there is no write path to fall back on. A single-tenant change
(disable an account, assign a licence, set out-of-office) belongs to
the m365 plugin; a packaged multi-tenant action (offboard, reset
MFA, revoke sessions) belongs to the cipp plugin.cipp plugin
(cipp-tenants, cipp-standards).microsoft-graph-connection.The short rule: ask one tenant → this skill; change one tenant →
m365; do either across the fleet → cipp.
Always start with microsoft_graph_suggest_queries. Do not invent raw Graph endpoints.
Microsoft Graph is enormous and its URL/$filter/$select syntax is full of sharp edges (advanced query parameters, ConsistencyLevel headers, OData casts). The suggest_queries tool exists precisely so the model doesn't have to guess. Hand-writing a Graph URL and passing it to microsoft_graph_get is an error pattern — even when you "know" the endpoint, route through suggest_queries so you get the catalog's correct, tested form.
| Tool | Role in the loop |
|---|---|
microsoft_graph_suggest_queries | RAG search over a curated catalog of Graph API examples. Input: a natural-language intent. Output: candidate Graph API calls (endpoint, parameters, description) ranked by relevance. |
microsoft_graph_get | Executes a read-only Graph GET. Input: a Graph API call (ideally one returned by suggest_queries). Honors the caller's roles, granted scopes, and Graph throttling. |
microsoft_graph_list_properties | Returns the schema for a Graph entity — its properties and relationships. Use it when you need to know what's selectable before constructing or refining a call. |
1. suggest_queries(intent) → candidate Graph calls
2. (model) select the candidate that best matches the question
3. get(selected candidate) → data
4. (optional) list_properties(entity) → schema, to refine $select or pick the right entity
5. (model) translate the JSON result into a plain-language answer
Steps 2 and 5 are your job — suggest_queries proposes, the model disposes. When several candidates look plausible, prefer the one whose description most precisely matches the user's intent and whose parameters you can fill confidently. If a candidate needs a property you're unsure exists, call list_properties first.
microsoft_graph_suggest_queries("count of all users in the tenant") → returns candidates such as a call against the users collection with a count.microsoft_graph_get(<that candidate>).microsoft_graph_suggest_queries("users who have not registered for multi-factor authentication") → expect candidates around authentication-methods registration reporting (admin reporting surface).microsoft_graph_get(<that candidate>).microsoft_graph_list_properties("user") to confirm those properties, then re-suggest/refine.microsoft_graph_suggest_queries("external guest users in the directory") → candidates filtering the users collection on guest user type.microsoft_graph_get(<that candidate>).This needs two reads joined by the model:
microsoft_graph_suggest_queries("user accounts with no recent sign-in activity") → an inactive-users / sign-in-activity reporting candidate. Run it with microsoft_graph_get.microsoft_graph_suggest_queries("users assigned a Microsoft 365 Copilot license") → a licensed-users candidate. Run it with microsoft_graph_get.The example endpoints above are illustrative of what
suggest_queriestypically returns — don't hard-code them. Always runsuggest_queriesfor the live, tenant-appropriate candidate.
list_propertiesCall microsoft_graph_list_properties when you need the schema of an entity — for example to know whether user exposes signInActivity, assignedLicenses, or createdDateTime, or what relationships group has. Use it to:
$select properties so a get returns exactly what the question needs;user vs servicePrincipal vs device).cipp plugin).microsoft-graph-connection skill).get calls — suggest_queries exists so one good call beats ten guesses.Raw Graph JSON is not an answer. Always translate: lead with the direct answer (a count, a yes/no, a named list), then supporting detail, then — if it's an audit-style question — a recommendation. Non-technical readers should never see GUIDs or JSON unless they ask.