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.
Files changed (42) hide show
  1. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.gitignore +1 -1
  2. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/CLAUDE.md +17 -21
  3. m365_roadmap_mcp-0.2.0/PKG-INFO +218 -0
  4. m365_roadmap_mcp-0.2.0/README.md +192 -0
  5. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/pyproject.toml +1 -1
  6. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/server.py +13 -15
  7. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/tools/search.py +33 -3
  8. m365_roadmap_mcp-0.2.0/tests/test_tools.py +244 -0
  9. m365_roadmap_mcp-0.1.0/PKG-INFO +0 -140
  10. m365_roadmap_mcp-0.1.0/README.md +0 -114
  11. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/__init__.py +0 -3
  12. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/feeds/__init__.py +0 -1
  13. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/feeds/azure_rss.py +0 -129
  14. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/models/__init__.py +0 -5
  15. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/models/update.py +0 -32
  16. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/server.py +0 -52
  17. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/__init__.py +0 -1
  18. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/categories.py +0 -35
  19. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/search.py +0 -154
  20. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/summarize.py +0 -128
  21. m365_roadmap_mcp-0.1.0/example_mcp_server/tests/__init__.py +0 -1
  22. m365_roadmap_mcp-0.1.0/example_mcp_server/tests/test_feeds.py +0 -37
  23. m365_roadmap_mcp-0.1.0/example_mcp_server/tests/test_tools.py +0 -257
  24. m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/cloud.py +0 -70
  25. m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/details.py +0 -35
  26. m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/recent.py +0 -50
  27. m365_roadmap_mcp-0.1.0/tests/test_tools.py +0 -399
  28. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.claude/agents/mcp-server-architect.md +0 -0
  29. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.claude/settings.local.json +0 -0
  30. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/.github/workflows/publish.yml +0 -0
  31. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/LICENSE +0 -0
  32. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/__init__.py +0 -0
  33. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/__main__.py +0 -0
  34. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/feeds/__init__.py +0 -0
  35. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/feeds/m365_api.py +0 -0
  36. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/models/__init__.py +0 -0
  37. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/models/feature.py +0 -0
  38. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/src/m365_roadmap_mcp/tools/__init__.py +0 -0
  39. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/tests/__init__.py +0 -0
  40. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/tests/api_snapshot.json +0 -0
  41. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.0}/tests/rss_feed_snapshot.xml +0 -0
  42. {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
- # .vscode/
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 the **example_mcp_server** pattern (Azure Updates MCP Server), which demonstrates the recommended architecture for MCP servers in this codebase:
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
- ## Proposed Tool Definitions for M365 Roadmap
72
-
73
- The README specifies these tools to implement:
74
-
75
- 1. **`search_roadmap`** - Search features by keywords and filters
76
- - Args: query, product, status
77
- - Returns: List of feature summaries with IDs and dates
78
-
79
- 2. **`get_feature_details`** - Retrieve full metadata for a roadmap ID
80
- - Args: feature_id
81
- - Returns: Detailed JSON with description and cloud instance tags
82
-
83
- 3. **`check_cloud_availability`** - Verify feature availability for specific cloud instances
84
- - Args: feature_id, instance (e.g., "GCC", "GCC High", "DoD")
85
- - Returns: Boolean availability and release date for that instance
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 Example Pattern**: The example_mcp_server demonstrates the exact architecture to replicate for the M365 roadmap server
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
+ [![Install in VS Code](https://img.shields.io/badge/Install_in-VS_Code-0078d4?style=flat-square&logo=visualstudiocode)](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
+ [![Install in Cursor](https://img.shields.io/badge/Install_in-Cursor-000000?style=flat-square&logo=cursor)](https://cursor.com/docs/context/mcp)
37
+ [![Install in Claude Code](https://img.shields.io/badge/Install_in-Claude_Code-9b6bff?style=flat-square&logo=anthropic)](https://code.claude.com/docs/en/mcp)
38
+ [![Install in Copilot CLI](https://img.shields.io/badge/Install_in-Copilot_CLI-28a745?style=flat-square&logo=github)](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
+ [![Install in VS Code](https://img.shields.io/badge/Install_in-VS_Code-0078d4?style=flat-square&logo=visualstudiocode)](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
+ [![Install in Cursor](https://img.shields.io/badge/Install_in-Cursor-000000?style=flat-square&logo=cursor)](https://cursor.com/docs/context/mcp)
11
+ [![Install in Claude Code](https://img.shields.io/badge/Install_in-Claude_Code-9b6bff?style=flat-square&logo=anthropic)](https://code.claude.com/docs/en/mcp)
12
+ [![Install in Copilot CLI](https://img.shields.io/badge/Install_in-Copilot_CLI-28a745?style=flat-square&logo=github)](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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "m365-roadmap-mcp"
7
- version = "0.1.0"
7
+ version = "0.2.0"
8
8
  description = "MCP server for querying the Microsoft 365 Roadmap"
9
9
  readme = "README.md"
10
10
  license = "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
- "Available tools:\n"
23
- "- search_roadmap: Find and filter roadmap features by keyword, product, "
24
- "status, cloud instance (GCC, GCC High, DoD), or feature ID.\n"
25
- "- get_feature_details: Retrieve full metadata for a specific roadmap "
26
- "feature by its ID.\n"
27
- "- check_cloud_availability: Verify whether a feature is available for a "
28
- "specific cloud instance (critical for government/defense clients).\n"
29
- "- list_recent_additions: List features recently added to the roadmap "
30
- "within a given number of days."
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, and cloud instance
17
- filtering into a single flexible tool. All filter parameters are optional and
18
- can be combined. When no filters are provided, returns the most recent features.
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