m365-roadmap-mcp 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.gitignore +1 -1
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/CLAUDE.md +17 -21
- m365_roadmap_mcp-0.2.0/PKG-INFO +218 -0
- m365_roadmap_mcp-0.2.0/README.md +192 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/pyproject.toml +1 -1
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/server.py +13 -15
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/tools/search.py +33 -3
- m365_roadmap_mcp-0.2.0/tests/test_tools.py +244 -0
- m365_roadmap_mcp-0.1.0/PKG-INFO +0 -140
- m365_roadmap_mcp-0.1.0/README.md +0 -114
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/__init__.py +0 -3
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/feeds/__init__.py +0 -1
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/feeds/azure_rss.py +0 -129
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/models/__init__.py +0 -5
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/models/update.py +0 -32
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/server.py +0 -52
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/__init__.py +0 -1
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/categories.py +0 -35
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/search.py +0 -154
- m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/summarize.py +0 -128
- m365_roadmap_mcp-0.1.0/example_mcp_server/tests/__init__.py +0 -1
- m365_roadmap_mcp-0.1.0/example_mcp_server/tests/test_feeds.py +0 -37
- m365_roadmap_mcp-0.1.0/example_mcp_server/tests/test_tools.py +0 -257
- m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/cloud.py +0 -70
- m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/details.py +0 -35
- m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/recent.py +0 -50
- m365_roadmap_mcp-0.1.0/tests/test_tools.py +0 -399
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.claude/agents/mcp-server-architect.md +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.claude/settings.local.json +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.github/workflows/publish.yml +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/LICENSE +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/__init__.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/__main__.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/feeds/__init__.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/feeds/m365_api.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/models/__init__.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/models/feature.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/tools/__init__.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/tests/__init__.py +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/tests/api_snapshot.json +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/tests/rss_feed_snapshot.xml +0 -0
- {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/tests/test_feeds.py +0 -0
|
@@ -186,7 +186,7 @@ cython_debug/
|
|
|
186
186
|
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
187
187
|
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
188
188
|
# you could uncomment the following to ignore the entire vscode folder
|
|
189
|
-
|
|
189
|
+
.vscode/
|
|
190
190
|
|
|
191
191
|
# Ruff stuff:
|
|
192
192
|
.ruff_cache/
|
|
@@ -10,7 +10,7 @@ This is a Model Context Protocol (MCP) server that enables AI agents to query th
|
|
|
10
10
|
|
|
11
11
|
## Architecture Pattern
|
|
12
12
|
|
|
13
|
-
This project follows
|
|
13
|
+
This project follows a standard MCP server architecture:
|
|
14
14
|
|
|
15
15
|
### Directory Structure
|
|
16
16
|
```
|
|
@@ -68,25 +68,21 @@ tests/
|
|
|
68
68
|
- RSS/API parsing logic separated from tool logic
|
|
69
69
|
- Returns strongly-typed model objects
|
|
70
70
|
|
|
71
|
-
##
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
4. **`list_recent_additions`** - List recently added features
|
|
88
|
-
- Args: days (integer)
|
|
89
|
-
- Returns: List of new features to monitor
|
|
71
|
+
## Tool Definitions
|
|
72
|
+
|
|
73
|
+
**`search_roadmap`** - Single tool for all M365 roadmap queries. All parameters are optional and can be combined.
|
|
74
|
+
- Args:
|
|
75
|
+
- query (str) - keyword search across title and description
|
|
76
|
+
- product (str) - filter by product tag (e.g. "Teams", "SharePoint")
|
|
77
|
+
- status (str) - filter by status ("In development", "Rolling out", "Launched")
|
|
78
|
+
- cloud_instance (str) - filter by cloud instance ("GCC", "GCC High", "DoD")
|
|
79
|
+
- feature_id (str) - retrieve a single feature by its roadmap ID (ignores other filters)
|
|
80
|
+
- added_within_days (int) - only return features added within N days (clamped 1-365)
|
|
81
|
+
- limit (int, default=10, max=100) - max results returned
|
|
82
|
+
- Returns: dict with total_found, features list, filters_applied
|
|
83
|
+
- Feature details: use `feature_id` to look up a specific feature
|
|
84
|
+
- Cloud availability: each feature includes `cloud_instances` list; combine with `cloud_instance` filter
|
|
85
|
+
- Recent additions: use `added_within_days` (e.g. 30 for last month)
|
|
90
86
|
|
|
91
87
|
## Key Schema Fields from M365 API
|
|
92
88
|
|
|
@@ -134,7 +130,7 @@ MCP_TRANSPORT=http MCP_HOST=0.0.0.0 MCP_PORT=8000 python -m <server_name>_mcp.se
|
|
|
134
130
|
|
|
135
131
|
## Implementation Notes
|
|
136
132
|
|
|
137
|
-
1. **Follow the
|
|
133
|
+
1. **Follow the Established Architecture**: The directory structure and patterns in `src/m365_roadmap_mcp/` define the standard to follow
|
|
138
134
|
2. **Async-First**: All tools and data fetching should be async
|
|
139
135
|
3. **Filter Composition**: Support combining multiple filters (see search.py for pattern)
|
|
140
136
|
4. **Error Handling**: Return error messages in `filters_applied` dict rather than raising exceptions
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: m365-roadmap-mcp
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: MCP server for querying the Microsoft 365 Roadmap
|
|
5
|
+
Project-URL: Homepage, https://github.com/jonnybottles/M365-roadmap-mcp-server
|
|
6
|
+
Project-URL: Repository, https://github.com/jonnybottles/M365-roadmap-mcp-server
|
|
7
|
+
Project-URL: Issues, https://github.com/jonnybottles/M365-roadmap-mcp-server/issues
|
|
8
|
+
Author: Justin Buttler
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: ai-agent,gcc,mcp,microsoft-365,roadmap
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Requires-Python: >=3.11
|
|
19
|
+
Requires-Dist: fastmcp
|
|
20
|
+
Requires-Dist: httpx
|
|
21
|
+
Requires-Dist: pydantic
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
24
|
+
Requires-Dist: pytest-asyncio; extra == 'dev'
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
|
|
27
|
+
# M365 Roadmap MCP Server
|
|
28
|
+
|
|
29
|
+
mcp-name: io.github.jonnybottles.m365-roadmap
|
|
30
|
+
|
|
31
|
+
A Python-based MCP (Model Context Protocol) server that enables AI agents to query the Microsoft 365 Roadmap programmatically.
|
|
32
|
+
|
|
33
|
+
## Quick Setup
|
|
34
|
+
|
|
35
|
+
[](https://vscode.dev/redirect/mcp/install?name=m365-roadmap-mcp&config=%7B%22type%22%3A%20%22stdio%22%2C%20%22command%22%3A%20%22uvx%22%2C%20%22args%22%3A%20%5B%22m365-roadmap-mcp%22%5D%7D)
|
|
36
|
+
[](https://cursor.com/docs/context/mcp)
|
|
37
|
+
[](https://code.claude.com/docs/en/mcp)
|
|
38
|
+
[](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli)
|
|
39
|
+
|
|
40
|
+
> **One-click install:** Click VS Code badge for automatic setup (requires `uv` installed)
|
|
41
|
+
> **Manual install:** See instructions below for Cursor, Claude Code, Copilot CLI, or Claude Desktop
|
|
42
|
+
|
|
43
|
+
## Features
|
|
44
|
+
|
|
45
|
+
Provides a single **`search_roadmap`** tool that handles all M365 roadmap queries. Combine any filters:
|
|
46
|
+
|
|
47
|
+
- **Keyword search** -- Find features by keyword in title/description
|
|
48
|
+
- **Product filter** -- Filter by product tag (Teams, SharePoint, etc.)
|
|
49
|
+
- **Status filter** -- Filter by status (In development, Rolling out, Launched)
|
|
50
|
+
- **Cloud instance filter** -- Filter by cloud instance (GCC, GCC High, DoD)
|
|
51
|
+
- **Feature lookup** -- Retrieve full metadata for a specific roadmap ID
|
|
52
|
+
- **Recent additions** -- List features added within the last N days
|
|
53
|
+
|
|
54
|
+
## Prompt Examples
|
|
55
|
+
|
|
56
|
+
Once connected to an MCP client, you can ask questions like:
|
|
57
|
+
|
|
58
|
+
1. **Search by product and status**: "What Microsoft Teams features are currently rolling out?"
|
|
59
|
+
2. **Check government cloud availability**: "Is Copilot available for GCC High yet?"
|
|
60
|
+
3. **Find recent additions**: "Show me everything added to the M365 roadmap in the last 30 days"
|
|
61
|
+
4. **Get feature details**: "Tell me more about roadmap feature 534606"
|
|
62
|
+
5. **Government cloud planning**: "My agency is on GCC High. Which OneDrive features can we expect?"
|
|
63
|
+
|
|
64
|
+
## Installation
|
|
65
|
+
|
|
66
|
+
### Prerequisites
|
|
67
|
+
|
|
68
|
+
- **Python 3.11+**
|
|
69
|
+
- An MCP-compatible client (Claude Desktop, Cursor, Claude Code, GitHub Copilot CLI, etc.)
|
|
70
|
+
|
|
71
|
+
### From PyPI (recommended)
|
|
72
|
+
|
|
73
|
+
Using `uvx` (requires [uv](https://github.com/astral-sh/uv)):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
uvx m365-roadmap-mcp
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Install uv if you don't have it:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# macOS / Linux
|
|
83
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
84
|
+
|
|
85
|
+
# Windows (PowerShell)
|
|
86
|
+
irm https://astral.sh/uv/install.ps1 | iex
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Or install with pip (no uv required):
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pip install m365-roadmap-mcp
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### From source (for development)
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
git clone https://github.com/jonnybottles/M365-roadmap-mcp-server.git
|
|
99
|
+
cd M365-roadmap-mcp-server
|
|
100
|
+
pip install -e ".[dev]"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Client Configuration
|
|
104
|
+
|
|
105
|
+
### Running the server
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
uvx m365-roadmap-mcp
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Or if installed with pip:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
m365-roadmap-mcp
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Claude Desktop
|
|
118
|
+
|
|
119
|
+
Add to your Claude Desktop MCP config:
|
|
120
|
+
|
|
121
|
+
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
122
|
+
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
123
|
+
|
|
124
|
+
**Using uvx (recommended)**
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"mcpServers": {
|
|
129
|
+
"m365-roadmap": {
|
|
130
|
+
"command": "uvx",
|
|
131
|
+
"args": ["m365-roadmap-mcp"]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Using installed package**
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"mcpServers": {
|
|
142
|
+
"m365-roadmap": {
|
|
143
|
+
"command": "m365-roadmap-mcp"
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Cursor
|
|
150
|
+
|
|
151
|
+
**Option 1: One-Click Install (Recommended)**
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
cursor://anysphere.cursor-deeplink/mcp/install?name=m365-roadmap-mcp&config=eyJjb21tYW5kIjogInV2eCIsICJhcmdzIjogWyJtMzY1LXJvYWRtYXAtbWNwIl19
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Option 2: Manual Configuration**
|
|
158
|
+
|
|
159
|
+
Add to your Cursor MCP config:
|
|
160
|
+
|
|
161
|
+
- macOS: `~/Library/Application Support/Cursor/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
|
|
162
|
+
- Windows: `%APPDATA%\Cursor\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`
|
|
163
|
+
|
|
164
|
+
### Claude Code
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
claude mcp add --transport stdio m365-roadmap -- uvx m365-roadmap-mcp
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### GitHub Copilot CLI
|
|
171
|
+
|
|
172
|
+
Add to `~/.copilot/mcp-config.json`:
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
{
|
|
176
|
+
"mcpServers": {
|
|
177
|
+
"m365-roadmap": {
|
|
178
|
+
"type": "stdio",
|
|
179
|
+
"command": "uvx",
|
|
180
|
+
"args": ["m365-roadmap-mcp"]
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Data Source
|
|
187
|
+
|
|
188
|
+
This MCP server pulls data from Microsoft's public roadmap API:
|
|
189
|
+
|
|
190
|
+
- **API Endpoint:** `https://www.microsoft.com/releasecommunications/api/v1/m365`
|
|
191
|
+
- **Authentication:** None required (public endpoint)
|
|
192
|
+
- **RSS Mirror:** `https://www.microsoft.com/microsoft-365/RoadmapFeatureRSS` (same data, RSS format)
|
|
193
|
+
|
|
194
|
+
This is the same data that powers the [Microsoft 365 Roadmap website](https://www.microsoft.com/en-us/microsoft-365/roadmap). The legacy endpoint (`roadmap-api.azurewebsites.net`) was retired in March 2025.
|
|
195
|
+
|
|
196
|
+
### Coverage and Limitations
|
|
197
|
+
|
|
198
|
+
The API returns approximately **1,900 active features** -- those currently In Development, Rolling Out, or recently Launched. This is a hard cap; older or retired features age out of the API and are no longer returned. The roadmap website may display historical features that are no longer present in the API.
|
|
199
|
+
|
|
200
|
+
There is no official Microsoft documentation for this API. It is a public, unauthenticated endpoint that the community has reverse-engineered. Microsoft Graph does not expose the public M365 roadmap (Graph's Service Communications API covers tenant-specific Message Center posts and Service Health, which is different data).
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Strategic Rationale
|
|
205
|
+
|
|
206
|
+
For organizations relying on Microsoft 365, Teams, or SharePoint, the "Roadmap" is the single source of truth for upcoming changes. However, navigating the roadmap website manually is cumbersome and disconnected from technical planning workflows. "When is Copilot coming to GCC High?" is a question that affects multi-million dollar contracts and deployment schedules.
|
|
207
|
+
|
|
208
|
+
Existing research indicates that while RSS feeds exist, there is no tool that allows an AI agent to structurally query this data to answer complex filtering questions. A "Roadmap Scout" MCP server empowers the Agent to act as a release manager, proactively identifying features that enable new capabilities or threaten existing customizations.
|
|
209
|
+
|
|
210
|
+
## Development
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
pytest
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## License
|
|
217
|
+
|
|
218
|
+
MIT
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# M365 Roadmap MCP Server
|
|
2
|
+
|
|
3
|
+
mcp-name: io.github.jonnybottles.m365-roadmap
|
|
4
|
+
|
|
5
|
+
A Python-based MCP (Model Context Protocol) server that enables AI agents to query the Microsoft 365 Roadmap programmatically.
|
|
6
|
+
|
|
7
|
+
## Quick Setup
|
|
8
|
+
|
|
9
|
+
[](https://vscode.dev/redirect/mcp/install?name=m365-roadmap-mcp&config=%7B%22type%22%3A%20%22stdio%22%2C%20%22command%22%3A%20%22uvx%22%2C%20%22args%22%3A%20%5B%22m365-roadmap-mcp%22%5D%7D)
|
|
10
|
+
[](https://cursor.com/docs/context/mcp)
|
|
11
|
+
[](https://code.claude.com/docs/en/mcp)
|
|
12
|
+
[](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli)
|
|
13
|
+
|
|
14
|
+
> **One-click install:** Click VS Code badge for automatic setup (requires `uv` installed)
|
|
15
|
+
> **Manual install:** See instructions below for Cursor, Claude Code, Copilot CLI, or Claude Desktop
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
Provides a single **`search_roadmap`** tool that handles all M365 roadmap queries. Combine any filters:
|
|
20
|
+
|
|
21
|
+
- **Keyword search** -- Find features by keyword in title/description
|
|
22
|
+
- **Product filter** -- Filter by product tag (Teams, SharePoint, etc.)
|
|
23
|
+
- **Status filter** -- Filter by status (In development, Rolling out, Launched)
|
|
24
|
+
- **Cloud instance filter** -- Filter by cloud instance (GCC, GCC High, DoD)
|
|
25
|
+
- **Feature lookup** -- Retrieve full metadata for a specific roadmap ID
|
|
26
|
+
- **Recent additions** -- List features added within the last N days
|
|
27
|
+
|
|
28
|
+
## Prompt Examples
|
|
29
|
+
|
|
30
|
+
Once connected to an MCP client, you can ask questions like:
|
|
31
|
+
|
|
32
|
+
1. **Search by product and status**: "What Microsoft Teams features are currently rolling out?"
|
|
33
|
+
2. **Check government cloud availability**: "Is Copilot available for GCC High yet?"
|
|
34
|
+
3. **Find recent additions**: "Show me everything added to the M365 roadmap in the last 30 days"
|
|
35
|
+
4. **Get feature details**: "Tell me more about roadmap feature 534606"
|
|
36
|
+
5. **Government cloud planning**: "My agency is on GCC High. Which OneDrive features can we expect?"
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
### Prerequisites
|
|
41
|
+
|
|
42
|
+
- **Python 3.11+**
|
|
43
|
+
- An MCP-compatible client (Claude Desktop, Cursor, Claude Code, GitHub Copilot CLI, etc.)
|
|
44
|
+
|
|
45
|
+
### From PyPI (recommended)
|
|
46
|
+
|
|
47
|
+
Using `uvx` (requires [uv](https://github.com/astral-sh/uv)):
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
uvx m365-roadmap-mcp
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Install uv if you don't have it:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# macOS / Linux
|
|
57
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
58
|
+
|
|
59
|
+
# Windows (PowerShell)
|
|
60
|
+
irm https://astral.sh/uv/install.ps1 | iex
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Or install with pip (no uv required):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pip install m365-roadmap-mcp
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### From source (for development)
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
git clone https://github.com/jonnybottles/M365-roadmap-mcp-server.git
|
|
73
|
+
cd M365-roadmap-mcp-server
|
|
74
|
+
pip install -e ".[dev]"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Client Configuration
|
|
78
|
+
|
|
79
|
+
### Running the server
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
uvx m365-roadmap-mcp
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Or if installed with pip:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
m365-roadmap-mcp
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Claude Desktop
|
|
92
|
+
|
|
93
|
+
Add to your Claude Desktop MCP config:
|
|
94
|
+
|
|
95
|
+
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
96
|
+
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
97
|
+
|
|
98
|
+
**Using uvx (recommended)**
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"mcpServers": {
|
|
103
|
+
"m365-roadmap": {
|
|
104
|
+
"command": "uvx",
|
|
105
|
+
"args": ["m365-roadmap-mcp"]
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Using installed package**
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"mcpServers": {
|
|
116
|
+
"m365-roadmap": {
|
|
117
|
+
"command": "m365-roadmap-mcp"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Cursor
|
|
124
|
+
|
|
125
|
+
**Option 1: One-Click Install (Recommended)**
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
cursor://anysphere.cursor-deeplink/mcp/install?name=m365-roadmap-mcp&config=eyJjb21tYW5kIjogInV2eCIsICJhcmdzIjogWyJtMzY1LXJvYWRtYXAtbWNwIl19
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Option 2: Manual Configuration**
|
|
132
|
+
|
|
133
|
+
Add to your Cursor MCP config:
|
|
134
|
+
|
|
135
|
+
- macOS: `~/Library/Application Support/Cursor/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
|
|
136
|
+
- Windows: `%APPDATA%\Cursor\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`
|
|
137
|
+
|
|
138
|
+
### Claude Code
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
claude mcp add --transport stdio m365-roadmap -- uvx m365-roadmap-mcp
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### GitHub Copilot CLI
|
|
145
|
+
|
|
146
|
+
Add to `~/.copilot/mcp-config.json`:
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"mcpServers": {
|
|
151
|
+
"m365-roadmap": {
|
|
152
|
+
"type": "stdio",
|
|
153
|
+
"command": "uvx",
|
|
154
|
+
"args": ["m365-roadmap-mcp"]
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Data Source
|
|
161
|
+
|
|
162
|
+
This MCP server pulls data from Microsoft's public roadmap API:
|
|
163
|
+
|
|
164
|
+
- **API Endpoint:** `https://www.microsoft.com/releasecommunications/api/v1/m365`
|
|
165
|
+
- **Authentication:** None required (public endpoint)
|
|
166
|
+
- **RSS Mirror:** `https://www.microsoft.com/microsoft-365/RoadmapFeatureRSS` (same data, RSS format)
|
|
167
|
+
|
|
168
|
+
This is the same data that powers the [Microsoft 365 Roadmap website](https://www.microsoft.com/en-us/microsoft-365/roadmap). The legacy endpoint (`roadmap-api.azurewebsites.net`) was retired in March 2025.
|
|
169
|
+
|
|
170
|
+
### Coverage and Limitations
|
|
171
|
+
|
|
172
|
+
The API returns approximately **1,900 active features** -- those currently In Development, Rolling Out, or recently Launched. This is a hard cap; older or retired features age out of the API and are no longer returned. The roadmap website may display historical features that are no longer present in the API.
|
|
173
|
+
|
|
174
|
+
There is no official Microsoft documentation for this API. It is a public, unauthenticated endpoint that the community has reverse-engineered. Microsoft Graph does not expose the public M365 roadmap (Graph's Service Communications API covers tenant-specific Message Center posts and Service Health, which is different data).
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Strategic Rationale
|
|
179
|
+
|
|
180
|
+
For organizations relying on Microsoft 365, Teams, or SharePoint, the "Roadmap" is the single source of truth for upcoming changes. However, navigating the roadmap website manually is cumbersome and disconnected from technical planning workflows. "When is Copilot coming to GCC High?" is a question that affects multi-million dollar contracts and deployment schedules.
|
|
181
|
+
|
|
182
|
+
Existing research indicates that while RSS feeds exist, there is no tool that allows an AI agent to structurally query this data to answer complex filtering questions. A "Roadmap Scout" MCP server empowers the Agent to act as a release manager, proactively identifying features that enable new capabilities or threaten existing customizations.
|
|
183
|
+
|
|
184
|
+
## Development
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
pytest
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## License
|
|
191
|
+
|
|
192
|
+
MIT
|
|
@@ -8,9 +8,6 @@ from fastmcp import FastMCP
|
|
|
8
8
|
# Suppress FastMCP's INFO logs to reduce console noise
|
|
9
9
|
logging.getLogger("fastmcp").setLevel(logging.WARNING)
|
|
10
10
|
|
|
11
|
-
from .tools.cloud import check_cloud_availability
|
|
12
|
-
from .tools.details import get_feature_details
|
|
13
|
-
from .tools.recent import list_recent_additions
|
|
14
11
|
from .tools.search import search_roadmap
|
|
15
12
|
|
|
16
13
|
# Create the MCP server
|
|
@@ -19,23 +16,24 @@ mcp = FastMCP(
|
|
|
19
16
|
instructions=(
|
|
20
17
|
"Query and search the Microsoft 365 Roadmap for upcoming features, "
|
|
21
18
|
"release dates, and cloud instance availability.\n\n"
|
|
22
|
-
"
|
|
23
|
-
"-
|
|
24
|
-
"
|
|
25
|
-
"-
|
|
26
|
-
"
|
|
27
|
-
"-
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
19
|
+
"Use the search_roadmap tool with any combination of filters:\n"
|
|
20
|
+
"- query: keyword search across title and description\n"
|
|
21
|
+
"- product: filter by product tag (e.g. 'Teams', 'SharePoint')\n"
|
|
22
|
+
"- status: filter by status ('In development', 'Rolling out', 'Launched')\n"
|
|
23
|
+
"- cloud_instance: filter by cloud instance ('GCC', 'GCC High', 'DoD')\n"
|
|
24
|
+
"- feature_id: retrieve a single feature by its roadmap ID\n"
|
|
25
|
+
"- added_within_days: show only features added within N days\n\n"
|
|
26
|
+
"Tips:\n"
|
|
27
|
+
"- To get feature details, use feature_id with the roadmap ID.\n"
|
|
28
|
+
"- To check cloud availability, use cloud_instance with a feature_id or "
|
|
29
|
+
"product filter. The cloud_instances field in each result shows all "
|
|
30
|
+
"supported instances.\n"
|
|
31
|
+
"- To list recent additions, use added_within_days (e.g. 30 for last month)."
|
|
31
32
|
),
|
|
32
33
|
)
|
|
33
34
|
|
|
34
35
|
# Register tools
|
|
35
36
|
mcp.tool(search_roadmap)
|
|
36
|
-
mcp.tool(get_feature_details)
|
|
37
|
-
mcp.tool(check_cloud_availability)
|
|
38
|
-
mcp.tool(list_recent_additions)
|
|
39
37
|
|
|
40
38
|
|
|
41
39
|
def main():
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""Search tool for querying and filtering M365 Roadmap features."""
|
|
2
2
|
|
|
3
|
+
from datetime import datetime, timedelta, timezone
|
|
4
|
+
|
|
3
5
|
from ..feeds.m365_api import fetch_features
|
|
4
6
|
|
|
5
7
|
|
|
@@ -9,13 +11,15 @@ async def search_roadmap(
|
|
|
9
11
|
status: str | None = None,
|
|
10
12
|
cloud_instance: str | None = None,
|
|
11
13
|
feature_id: str | None = None,
|
|
14
|
+
added_within_days: int | None = None,
|
|
12
15
|
limit: int = 10,
|
|
13
16
|
) -> dict:
|
|
14
17
|
"""Search the Microsoft 365 Roadmap for features matching keywords and filters.
|
|
15
18
|
|
|
16
|
-
Combines keyword search, product filtering, status filtering,
|
|
17
|
-
filtering into a single flexible tool. All filter
|
|
18
|
-
can be combined. When no filters are provided,
|
|
19
|
+
Combines keyword search, product filtering, status filtering, cloud instance
|
|
20
|
+
filtering, and recency filtering into a single flexible tool. All filter
|
|
21
|
+
parameters are optional and can be combined. When no filters are provided,
|
|
22
|
+
returns the most recent features.
|
|
19
23
|
|
|
20
24
|
Use this tool to:
|
|
21
25
|
- Browse recent roadmap features (no filters)
|
|
@@ -24,6 +28,7 @@ async def search_roadmap(
|
|
|
24
28
|
- Find features by status (status="In development", "Rolling out", "Launched")
|
|
25
29
|
- Filter by cloud instance (cloud_instance="GCC High", "DoD", "GCC")
|
|
26
30
|
- Retrieve a specific feature by ID (feature_id="534606")
|
|
31
|
+
- List recently added features (added_within_days=30)
|
|
27
32
|
- Combine any of the above (query="Copilot" + product="Teams" + cloud_instance="GCC")
|
|
28
33
|
|
|
29
34
|
Args:
|
|
@@ -35,6 +40,9 @@ async def search_roadmap(
|
|
|
35
40
|
e.g. "GCC" matches "GCC", "GCC High" matches "GCC High").
|
|
36
41
|
feature_id: Optional roadmap ID to retrieve a single specific feature.
|
|
37
42
|
When provided, all other filters are ignored.
|
|
43
|
+
added_within_days: Optional number of days to look back for recently added
|
|
44
|
+
features (clamped to 1–365). Only features with a created date within
|
|
45
|
+
this window are returned.
|
|
38
46
|
limit: Maximum number of results to return (default: 10, max: 100).
|
|
39
47
|
Ignored when feature_id is provided.
|
|
40
48
|
|
|
@@ -64,6 +72,12 @@ async def search_roadmap(
|
|
|
64
72
|
# Clamp limit to reasonable bounds
|
|
65
73
|
limit = max(1, min(limit, 100))
|
|
66
74
|
|
|
75
|
+
# Compute recency cutoff if requested
|
|
76
|
+
cutoff = None
|
|
77
|
+
if added_within_days is not None:
|
|
78
|
+
added_within_days = max(1, min(added_within_days, 365))
|
|
79
|
+
cutoff = datetime.now(timezone.utc) - timedelta(days=added_within_days)
|
|
80
|
+
|
|
67
81
|
# Prepare lowercase values for case-insensitive matching
|
|
68
82
|
query_lower = query.lower() if query else None
|
|
69
83
|
product_lower = product.lower() if product else None
|
|
@@ -96,6 +110,19 @@ async def search_roadmap(
|
|
|
96
110
|
):
|
|
97
111
|
continue
|
|
98
112
|
|
|
113
|
+
# Recency filter (added_within_days)
|
|
114
|
+
if cutoff is not None:
|
|
115
|
+
if not feature.created:
|
|
116
|
+
continue
|
|
117
|
+
try:
|
|
118
|
+
created_dt = datetime.fromisoformat(feature.created)
|
|
119
|
+
if created_dt.tzinfo is None:
|
|
120
|
+
created_dt = created_dt.replace(tzinfo=timezone.utc)
|
|
121
|
+
if created_dt < cutoff:
|
|
122
|
+
continue
|
|
123
|
+
except (ValueError, TypeError):
|
|
124
|
+
continue
|
|
125
|
+
|
|
99
126
|
matched.append(feature)
|
|
100
127
|
|
|
101
128
|
# Build filters summary
|
|
@@ -108,6 +135,9 @@ async def search_roadmap(
|
|
|
108
135
|
filters_applied["status"] = status
|
|
109
136
|
if cloud_instance:
|
|
110
137
|
filters_applied["cloud_instance"] = cloud_instance
|
|
138
|
+
if added_within_days is not None:
|
|
139
|
+
filters_applied["added_within_days"] = added_within_days
|
|
140
|
+
filters_applied["cutoff_date"] = cutoff.isoformat()
|
|
111
141
|
if not filters_applied:
|
|
112
142
|
filters_applied["note"] = "No filters applied, returning most recent features"
|
|
113
143
|
|