Microsoft Release Communications (MRC) roadmap MCP — playbook¶
What this is. A free, no-auth MCP server published by Microsoft that exposes the Microsoft 365 roadmap and Azure updates as queryable tools. This playbook is the working brain for using it — the endpoint, the tools as they actually behave on the wire, the query recipes, and the traps.
Read this before any monthly "What's New in Microsoft 365 Copilot" research pass, or any task that needs "what shipped / what's coming" roadmap data.
Status: live and verified. All observations below were taken from the running server on 2026-08-24. Source of truth: Microsoft Learn — Microsoft Release Communications MCP server.
1. Why this matters¶
Before this, roadmap data came from scraping or polling the REST API on a schedule. The MCP turns the same corpus into something that can be asked a question mid-conversation — "what M365 Copilot items were posted in August?" — without leaving the session or building anything.
🔴 It is not a new data source. It is a query interface over the same corpus the existing daily pipeline at C:\ssClawy\m365-roadmap\ already ingests (scripts/fetch_roadmap.py → https://www.microsoft.com/releasecommunications/api/v1/m365, cron 0 5 * * *). Both report the same total item count.
Therefore: use the MCP for ad-hoc interrogation during research. Do not build a second ingestion pipeline, and do not treat MCP output as a second opinion — it is the same data.
2. Connection facts¶
| Property | Value |
|---|---|
| Endpoint | https://www.microsoft.com/releasecommunications/mcp |
| Transport | Streamable HTTP + SSE (text/event-stream) |
| Auth | None. No licence, no tenant, no key |
| Method | POST only — a browser GET returns 405 |
| Protocol | 2025-06-18 |
serverInfo |
ReleaseCommunicationsApi v1.0.0.0 |
| Session | Stateless — no Mcp-Session-Id header returned |
| Rate limits / SLA | UNKNOWN — not documented. Do not build anything that hammers it |
Registered in ~/.copilot/mcp-config.json as mrc-roadmap with an explicit two-tool allowlist (not ["*"]) to keep context cost down:
"mrc-roadmap": {
"type": "http",
"url": "https://www.microsoft.com/releasecommunications/mcp",
"tools": ["get_recent_m365_roadmaps", "get_m365_roadmap_by_id"]
}
The two Azure tools are deliberately omitted — add them to the array if Azure update work ever needs them.
3. 🔴 Trap #1 — the Learn doc names tools that do not exist¶
The published Learn page documents get_recent_roadmaps and get_roadmap_by_id. Neither exists on the server. Its copy-paste "system instructions" snippet therefore names two nonexistent tools.
A direct call returns an explicit JSON-RPC error — -32602 Unknown tool: 'get_recent_roadmaps' — so this is not silent at the wire level. In practice, though, a well-behaved client reads tools/list first, never offers the stale name, and simply never invokes anything. You get no error, no data, and no explanation. That is the failure mode to watch for.
Live tools/list, observed 2026-08-24:
| Tool | Purpose |
|---|---|
get_recent_m365_roadmaps |
List/filter M365 roadmap items |
get_m365_roadmap_by_id |
Full untruncated detail for one item |
get_recent_azure_updates |
List/filter Azure updates |
get_azure_update_by_id |
Full detail for one Azure update |
Rule: live tools/list always wins over static prose — including over this document. Tool names may change again as the product evolves; re-run tools/list before trusting any recipe here.
4. 🔴 Trap #2 — the results array is items, not value¶
The response looks OData-shaped, so the instinct is to read .value. That returns nothing while totalCount cheerfully reports 14 — a silent empty result that looks like "no data this month".
Actual envelope:
{ "items": [ ... ], "totalCount": 14, "limit": 50, "offset": 0, "hasMore": false, "returnedCount": 14 }
| Field | Meaning |
|---|---|
items |
The results array. Use this. |
totalCount |
Total matching the filter across all pages |
returnedCount |
How many came back in this response |
limit / offset |
Page size / current position |
hasMore |
Whether another page exists |
Guard: if totalCount > 0 but your array is empty, you are reading the wrong key — not looking at an empty month.
5. 🔴 Trap #3 — two different meanings of "this month"¶
This is the one that silently corrupts a monthly recap.
| Field | Meaning | Format |
|---|---|---|
created / modified |
When the roadmap post was published | ISO 8601 datetime |
generalAvailabilityDate |
When the feature reaches GA | YYYY-MM |
previewAvailabilityDate |
When the feature hits preview | YYYY-MM |
Filtering on created answers "what was announced in August?". Filtering on generalAvailabilityDate answers "what ships in August?" — a different set of items. An item created in August can have a GA of 2026-12, and an item shipping in August may have been posted months earlier.
For a monthly recap, a complete sweep needs both passes. Decide which question the section is answering, and say so.
Measured 2026-08-24, through the MCP layer, for Microsoft Copilot (Microsoft 365) in August 2026:
| Pass | Filter | Items |
|---|---|---|
| A — announced | created ge 2026-08-01T00:00:00Z and created le 2026-08-31T23:59:59Z |
14 |
| B — shipping | generalAvailabilityDate eq '2026-08' or previewAvailabilityDate eq '2026-08' |
34 |
The two passes overlapped by just 2 items (568788, 569215) out of 46 unique. Running only pass A misses 32 items; running only pass B misses 12. Neither pass is a superset of the other, and both reported hasMore=false, so this is not a pagination artefact — it is the real shape of the data. Treat a single-pass sweep as incomplete by default, not as a shortcut.
6. Tested recipe — the monthly What's New sweep¶
Filter (OData), validated on the live server:
products/any(p: p eq 'Microsoft Copilot (Microsoft 365)') and created ge 2026-08-01T00:00:00Z and created le 2026-08-31T23:59:59Z
Verified result for August 2026: 14/14 items, hasMore=false — including Copilot memory in Researcher (GA 2026-11), Federated Copilot Connectors (GA 2026-09), and Code Blocks in M365 Copilot (GA 2026-09).
Working PowerShell harness (SSE responses need reassembling before ConvertFrom-Json):
$endpoint = 'https://www.microsoft.com/releasecommunications/mcp'
$hdr = @{ 'Content-Type'='application/json'; 'Accept'='application/json, text/event-stream' }
function Invoke-Mcp($Body) {
$r = Invoke-WebRequest -Uri $endpoint -Method Post -Headers $hdr `
-Body ($Body | ConvertTo-Json -Depth 12) -UseBasicParsing -TimeoutSec 90
($r.Content -split "`n" | Where-Object { $_ -like 'data: *' } |
ForEach-Object { $_.Substring(6) }) -join '' | ConvertFrom-Json
}
# handshake first - required
Invoke-Mcp @{ jsonrpc='2.0'; id=1; method='initialize'; params=@{
protocolVersion='2025-06-18'; capabilities=@{}
clientInfo=@{ name='atlas'; version='1.0' } } } | Out-Null
$filter = "products/any(p: p eq 'Microsoft Copilot (Microsoft 365)') and " +
"created ge 2026-08-01T00:00:00Z and created le 2026-08-31T23:59:59Z"
$res = Invoke-Mcp @{ jsonrpc='2.0'; id=2; method='tools/call'; params=@{
name='get_recent_m365_roadmaps'; arguments=@{ filter=$filter; top=50 } } }
$p = $res.result.content[0].text | ConvertFrom-Json
$p.items | ForEach-Object { "{0} GA:{1} {2}" -f $_.id, $_.generalAvailabilityDate, $_.title }
⚠️ Do not name a PowerShell function parameter $args — it is a reserved automatic variable and will break silently.
Two-step pattern¶
get_recent_m365_roadmaps returns truncated descriptions. For anything being written up, follow with get_m365_roadmap_by_id on that id for the full text.
Pagination¶
Page size caps at 50. When hasMore is true, increment skip by 50 and repeat until it flips false. Page one is never proof of completeness.
Cost discipline¶
An unfiltered 50-item response is ≈ 39.5 KB. Never make an unfiltered list call inside a working session — always filter by product and date window first.
7. 🔴 Trap #4 — multiword search fails¶
search: "Microsoft 365 Copilot" (multiword) returns a generic tool error. Single-word search works.
Prefer OData filter over search in all cases. Filters are precise, testable, and do not silently degrade.
8. Terms of use¶
The Learn page is explicit, and there is no ambiguity to hide behind:
"Although the MRC MCP Server is publicly available and free to use, users are subject to the Microsoft API Terms of Use. Read and understand the API Terms of Use before using the MRC MCP Server and before including the output in any production environment."
Read the linked terms before putting MRC output into anything published.
Practically, for the monthly recap: use MRC for discovery, then cite the canonical public roadmap page for each item — which the blog already does via its 📖 Roadmap NNNNNN links.
🔴 Citation is provenance, not a waiver. It makes every claim traceable to a public Microsoft page, which is good practice and already house style. It does not exempt anything from the terms above.
9. Where this plugs into the monthly recap¶
Per whats-new-copilot-pack-playbook.md §"the blog is the single source", the pack is generated from the finished blog and missing-source reconciliation belongs upstream.
Therefore MRC belongs in the blog research stage, not pack generation:
- Draft the month's blog from every official source available at the time — release notes, roadmap, Work IQ, and the official Tech Community roundup if it has landed. 🔴 Never wait for the roundup. It is a completeness aid, not a publish gate: record
NOT_YET_PUBLISHEDand ship on schedule; anything missed rolls into the next issue. - Run the §6 sweep for that month (both
createdand GA passes per §5). - Reconcile: anything on the roadmap but absent from the draft is a candidate, not an automatic inclusion — the blog is an editorial product, not a roadmap mirror.
- For each item kept, pull full detail with
get_m365_roadmap_by_idand cite the public roadmap page. - Only then generate the pack.
Consistent with the house rule for the series: frame as "Microsoft announced X; this is what I could reproduce on \<date> in my tenant" — the roadmap says what is planned, which is not the same as what is testable today.
10. Known unknowns¶
- Rate limits / SLA — undocumented.
- Tool-name stability — already drifted once from the Learn doc; assume it can drift again. Re-run
tools/list. - Field completeness — only fields observed on real responses are documented here; the schema may expose more.
Set 2026-08-24. All server behaviour observed live on that date. Sibling: whats-new-copilot-pack-playbook.md (the monthly pack) · C:\ssClawy\m365-roadmap\ (the existing daily REST pipeline over the same corpus).