m365-roadmap-mcp 0.1.0__tar.gz → 0.2.1__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 (43) hide show
  1. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/.github/workflows/publish.yml +10 -0
  2. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/.gitignore +5 -1
  3. m365_roadmap_mcp-0.2.1/PKG-INFO +211 -0
  4. m365_roadmap_mcp-0.2.1/README.md +185 -0
  5. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/pyproject.toml +1 -1
  6. m365_roadmap_mcp-0.2.1/server.json +23 -0
  7. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/__init__.py +1 -1
  8. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/server.py +13 -15
  9. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/tools/search.py +33 -3
  10. m365_roadmap_mcp-0.2.1/tests/test_tools.py +244 -0
  11. m365_roadmap_mcp-0.1.0/.claude/agents/mcp-server-architect.md +0 -164
  12. m365_roadmap_mcp-0.1.0/.claude/settings.local.json +0 -67
  13. m365_roadmap_mcp-0.1.0/CLAUDE.md +0 -143
  14. m365_roadmap_mcp-0.1.0/PKG-INFO +0 -140
  15. m365_roadmap_mcp-0.1.0/README.md +0 -114
  16. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/__init__.py +0 -3
  17. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/feeds/__init__.py +0 -1
  18. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/feeds/azure_rss.py +0 -129
  19. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/models/__init__.py +0 -5
  20. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/models/update.py +0 -32
  21. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/server.py +0 -52
  22. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/__init__.py +0 -1
  23. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/categories.py +0 -35
  24. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/search.py +0 -154
  25. m365_roadmap_mcp-0.1.0/example_mcp_server/src/azure_updates_mcp/tools/summarize.py +0 -128
  26. m365_roadmap_mcp-0.1.0/example_mcp_server/tests/__init__.py +0 -1
  27. m365_roadmap_mcp-0.1.0/example_mcp_server/tests/test_feeds.py +0 -37
  28. m365_roadmap_mcp-0.1.0/example_mcp_server/tests/test_tools.py +0 -257
  29. m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/cloud.py +0 -70
  30. m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/details.py +0 -35
  31. m365_roadmap_mcp-0.1.0/src/m365_roadmap_mcp/tools/recent.py +0 -50
  32. m365_roadmap_mcp-0.1.0/tests/test_tools.py +0 -399
  33. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/LICENSE +0 -0
  34. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/__main__.py +0 -0
  35. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/feeds/__init__.py +0 -0
  36. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/feeds/m365_api.py +0 -0
  37. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/models/__init__.py +0 -0
  38. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/models/feature.py +0 -0
  39. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/src/m365_roadmap_mcp/tools/__init__.py +0 -0
  40. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/tests/__init__.py +0 -0
  41. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/tests/api_snapshot.json +0 -0
  42. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/tests/rss_feed_snapshot.xml +0 -0
  43. {m365_roadmap_mcp-0.1.0 → m365_roadmap_mcp-0.2.1}/tests/test_feeds.py +0 -0
@@ -27,3 +27,13 @@ jobs:
27
27
 
28
28
  - name: Publish to PyPI
29
29
  uses: pypa/gh-action-pypi-publish@release/v1
30
+
31
+ - name: Install mcp-publisher
32
+ run: |
33
+ curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher
34
+
35
+ - name: Authenticate to MCP Registry
36
+ run: ./mcp-publisher login github-oidc
37
+
38
+ - name: Publish to MCP Registry
39
+ run: ./mcp-publisher publish
@@ -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/
@@ -201,6 +201,10 @@ cython_debug/
201
201
  .cursorignore
202
202
  .cursorindexingignore
203
203
 
204
+ # Claude Code
205
+ .claude/
206
+ CLAUDE.md
207
+
204
208
  # Marimo
205
209
  marimo/_static/
206
210
  marimo/_lsp/
@@ -0,0 +1,211 @@
1
+ Metadata-Version: 2.4
2
+ Name: m365-roadmap-mcp
3
+ Version: 0.2.1
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
+ ## Strategic Rationale
34
+
35
+ 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.
36
+
37
+ 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.
38
+
39
+ ## Prompt Examples
40
+
41
+ Once connected to an MCP client, you can ask questions like:
42
+
43
+ 1. **Search by product and status**: "What Microsoft Teams features are currently rolling out?"
44
+ 2. **Check government cloud availability**: "Is Copilot available for GCC High yet?"
45
+ 3. **Find recent additions**: "Show me everything added to the M365 roadmap in the last 30 days"
46
+ 4. **Get feature details**: "Tell me more about roadmap feature 534606"
47
+ 5. **Government cloud planning**: "My agency is on GCC High. Which OneDrive features can we expect?"
48
+
49
+ ## Installation
50
+
51
+ ### Prerequisites
52
+
53
+ - **Python 3.11+**
54
+ - An MCP-compatible client (Claude Desktop, Cursor, Claude Code, GitHub Copilot CLI, etc.)
55
+
56
+ ### From PyPI (recommended)
57
+
58
+ Using `uvx` (requires [uv](https://github.com/astral-sh/uv)):
59
+
60
+ ```bash
61
+ uvx m365-roadmap-mcp
62
+ ```
63
+
64
+ To update to the latest version:
65
+
66
+ ```bash
67
+ uvx m365-roadmap-mcp@latest
68
+ ```
69
+
70
+ Install uv if you don't have it:
71
+
72
+ ```bash
73
+ # macOS / Linux
74
+ curl -LsSf https://astral.sh/uv/install.sh | sh
75
+
76
+ # Windows (PowerShell)
77
+ irm https://astral.sh/uv/install.ps1 | iex
78
+ ```
79
+
80
+ Or install with pip (no uv required):
81
+
82
+ ```bash
83
+ pip install m365-roadmap-mcp
84
+
85
+ # Update to latest
86
+ pip install --upgrade m365-roadmap-mcp
87
+ ```
88
+ ## Quick Setup
89
+
90
+ [![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)
91
+ [![Install in Cursor](https://img.shields.io/badge/Install_in-Cursor-000000?style=flat-square&logo=cursor)](https://cursor.com/docs/context/mcp)
92
+ [![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)
93
+ [![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)
94
+
95
+ > **One-click install:** Click VS Code badge for automatic setup (requires `uv` installed)
96
+ > **Manual install:** See instructions below for Cursor, Claude Code, Copilot CLI, or Claude Desktop
97
+
98
+ ## Client Configuration
99
+
100
+ ### Running the server
101
+
102
+ ```bash
103
+ uvx m365-roadmap-mcp
104
+ ```
105
+
106
+ Or if installed with pip:
107
+
108
+ ```bash
109
+ m365-roadmap-mcp
110
+ ```
111
+
112
+ ### Claude Desktop
113
+
114
+ Add to your Claude Desktop MCP config:
115
+
116
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
117
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
118
+
119
+ **Using uvx (recommended)**
120
+
121
+ ```json
122
+ {
123
+ "mcpServers": {
124
+ "m365-roadmap": {
125
+ "command": "uvx",
126
+ "args": ["m365-roadmap-mcp"]
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ **Using installed package**
133
+
134
+ ```json
135
+ {
136
+ "mcpServers": {
137
+ "m365-roadmap": {
138
+ "command": "m365-roadmap-mcp"
139
+ }
140
+ }
141
+ }
142
+ ```
143
+
144
+ ### Cursor
145
+
146
+ **Option 1: One-Click Install (Recommended)**
147
+
148
+ ```
149
+ cursor://anysphere.cursor-deeplink/mcp/install?name=m365-roadmap-mcp&config=eyJjb21tYW5kIjogInV2eCIsICJhcmdzIjogWyJtMzY1LXJvYWRtYXAtbWNwIl19
150
+ ```
151
+
152
+ **Option 2: Manual Configuration**
153
+
154
+ Add to your Cursor MCP config:
155
+
156
+ - macOS: `~/Library/Application Support/Cursor/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
157
+ - Windows: `%APPDATA%\Cursor\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`
158
+
159
+ ### Claude Code
160
+
161
+ ```bash
162
+ claude mcp add --transport stdio m365-roadmap -- uvx m365-roadmap-mcp
163
+ ```
164
+
165
+ ### GitHub Copilot CLI
166
+
167
+ Add to `~/.copilot/mcp-config.json`:
168
+
169
+ ```json
170
+ {
171
+ "mcpServers": {
172
+ "m365-roadmap": {
173
+ "type": "stdio",
174
+ "command": "uvx",
175
+ "args": ["m365-roadmap-mcp"]
176
+ }
177
+ }
178
+ }
179
+ ```
180
+ ## Features
181
+
182
+ Provides a single **`search_roadmap`** tool that handles all M365 roadmap queries. Combine any filters:
183
+
184
+ - **Keyword search** -- Find features by keyword in title/description
185
+ - **Product filter** -- Filter by product tag (Teams, SharePoint, etc.)
186
+ - **Status filter** -- Filter by status (In development, Rolling out, Launched)
187
+ - **Cloud instance filter** -- Filter by cloud instance (GCC, GCC High, DoD)
188
+ - **Feature lookup** -- Retrieve full metadata for a specific roadmap ID
189
+ - **Recent additions** -- List features added within the last N days
190
+
191
+ ## Data Source
192
+
193
+ This MCP server pulls data from Microsoft's public roadmap API:
194
+
195
+ - **API Endpoint:** `https://www.microsoft.com/releasecommunications/api/v1/m365`
196
+ - **Authentication:** None required (public endpoint)
197
+ - **RSS Mirror:** `https://www.microsoft.com/microsoft-365/RoadmapFeatureRSS` (same data, RSS format)
198
+
199
+ 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.
200
+
201
+ ### Coverage and Limitations
202
+
203
+ 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.
204
+
205
+ 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).
206
+
207
+ ---
208
+
209
+ ## License
210
+
211
+ MIT
@@ -0,0 +1,185 @@
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
+ ## Strategic Rationale
8
+
9
+ 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.
10
+
11
+ 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.
12
+
13
+ ## Prompt Examples
14
+
15
+ Once connected to an MCP client, you can ask questions like:
16
+
17
+ 1. **Search by product and status**: "What Microsoft Teams features are currently rolling out?"
18
+ 2. **Check government cloud availability**: "Is Copilot available for GCC High yet?"
19
+ 3. **Find recent additions**: "Show me everything added to the M365 roadmap in the last 30 days"
20
+ 4. **Get feature details**: "Tell me more about roadmap feature 534606"
21
+ 5. **Government cloud planning**: "My agency is on GCC High. Which OneDrive features can we expect?"
22
+
23
+ ## Installation
24
+
25
+ ### Prerequisites
26
+
27
+ - **Python 3.11+**
28
+ - An MCP-compatible client (Claude Desktop, Cursor, Claude Code, GitHub Copilot CLI, etc.)
29
+
30
+ ### From PyPI (recommended)
31
+
32
+ Using `uvx` (requires [uv](https://github.com/astral-sh/uv)):
33
+
34
+ ```bash
35
+ uvx m365-roadmap-mcp
36
+ ```
37
+
38
+ To update to the latest version:
39
+
40
+ ```bash
41
+ uvx m365-roadmap-mcp@latest
42
+ ```
43
+
44
+ Install uv if you don't have it:
45
+
46
+ ```bash
47
+ # macOS / Linux
48
+ curl -LsSf https://astral.sh/uv/install.sh | sh
49
+
50
+ # Windows (PowerShell)
51
+ irm https://astral.sh/uv/install.ps1 | iex
52
+ ```
53
+
54
+ Or install with pip (no uv required):
55
+
56
+ ```bash
57
+ pip install m365-roadmap-mcp
58
+
59
+ # Update to latest
60
+ pip install --upgrade m365-roadmap-mcp
61
+ ```
62
+ ## Quick Setup
63
+
64
+ [![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)
65
+ [![Install in Cursor](https://img.shields.io/badge/Install_in-Cursor-000000?style=flat-square&logo=cursor)](https://cursor.com/docs/context/mcp)
66
+ [![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)
67
+ [![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)
68
+
69
+ > **One-click install:** Click VS Code badge for automatic setup (requires `uv` installed)
70
+ > **Manual install:** See instructions below for Cursor, Claude Code, Copilot CLI, or Claude Desktop
71
+
72
+ ## Client Configuration
73
+
74
+ ### Running the server
75
+
76
+ ```bash
77
+ uvx m365-roadmap-mcp
78
+ ```
79
+
80
+ Or if installed with pip:
81
+
82
+ ```bash
83
+ m365-roadmap-mcp
84
+ ```
85
+
86
+ ### Claude Desktop
87
+
88
+ Add to your Claude Desktop MCP config:
89
+
90
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
91
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
92
+
93
+ **Using uvx (recommended)**
94
+
95
+ ```json
96
+ {
97
+ "mcpServers": {
98
+ "m365-roadmap": {
99
+ "command": "uvx",
100
+ "args": ["m365-roadmap-mcp"]
101
+ }
102
+ }
103
+ }
104
+ ```
105
+
106
+ **Using installed package**
107
+
108
+ ```json
109
+ {
110
+ "mcpServers": {
111
+ "m365-roadmap": {
112
+ "command": "m365-roadmap-mcp"
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ ### Cursor
119
+
120
+ **Option 1: One-Click Install (Recommended)**
121
+
122
+ ```
123
+ cursor://anysphere.cursor-deeplink/mcp/install?name=m365-roadmap-mcp&config=eyJjb21tYW5kIjogInV2eCIsICJhcmdzIjogWyJtMzY1LXJvYWRtYXAtbWNwIl19
124
+ ```
125
+
126
+ **Option 2: Manual Configuration**
127
+
128
+ Add to your Cursor MCP config:
129
+
130
+ - macOS: `~/Library/Application Support/Cursor/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
131
+ - Windows: `%APPDATA%\Cursor\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`
132
+
133
+ ### Claude Code
134
+
135
+ ```bash
136
+ claude mcp add --transport stdio m365-roadmap -- uvx m365-roadmap-mcp
137
+ ```
138
+
139
+ ### GitHub Copilot CLI
140
+
141
+ Add to `~/.copilot/mcp-config.json`:
142
+
143
+ ```json
144
+ {
145
+ "mcpServers": {
146
+ "m365-roadmap": {
147
+ "type": "stdio",
148
+ "command": "uvx",
149
+ "args": ["m365-roadmap-mcp"]
150
+ }
151
+ }
152
+ }
153
+ ```
154
+ ## Features
155
+
156
+ Provides a single **`search_roadmap`** tool that handles all M365 roadmap queries. Combine any filters:
157
+
158
+ - **Keyword search** -- Find features by keyword in title/description
159
+ - **Product filter** -- Filter by product tag (Teams, SharePoint, etc.)
160
+ - **Status filter** -- Filter by status (In development, Rolling out, Launched)
161
+ - **Cloud instance filter** -- Filter by cloud instance (GCC, GCC High, DoD)
162
+ - **Feature lookup** -- Retrieve full metadata for a specific roadmap ID
163
+ - **Recent additions** -- List features added within the last N days
164
+
165
+ ## Data Source
166
+
167
+ This MCP server pulls data from Microsoft's public roadmap API:
168
+
169
+ - **API Endpoint:** `https://www.microsoft.com/releasecommunications/api/v1/m365`
170
+ - **Authentication:** None required (public endpoint)
171
+ - **RSS Mirror:** `https://www.microsoft.com/microsoft-365/RoadmapFeatureRSS` (same data, RSS format)
172
+
173
+ 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.
174
+
175
+ ### Coverage and Limitations
176
+
177
+ 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.
178
+
179
+ 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).
180
+
181
+ ---
182
+
183
+ ## License
184
+
185
+ 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.1"
8
8
  description = "MCP server for querying the Microsoft 365 Roadmap"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.jonnybottles/m365-roadmap",
4
+ "description": "Query the Microsoft 365 Roadmap from AI agents",
5
+ "title": "M365 Roadmap",
6
+ "repository": {
7
+ "url": "https://github.com/jonnybottles/M365-roadmap-mcp-server",
8
+ "source": "github"
9
+ },
10
+ "version": "0.2.1",
11
+ "packages": [
12
+ {
13
+ "registryType": "pypi",
14
+ "registryBaseUrl": "https://pypi.org",
15
+ "identifier": "m365-roadmap-mcp",
16
+ "version": "0.2.1",
17
+ "runtimeHint": "uvx",
18
+ "transport": {
19
+ "type": "stdio"
20
+ }
21
+ }
22
+ ]
23
+ }
@@ -1,3 +1,3 @@
1
1
  """M365 Roadmap MCP Server - Query the Microsoft 365 Roadmap via MCP."""
2
2
 
3
- __version__ = "0.1.0"
3
+ __version__ = "0.2.1"
@@ -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