rootly-mcp-server 2.0.10__tar.gz → 2.0.12__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 (36) hide show
  1. rootly_mcp_server-2.0.12/.github/workflows/test.yml +71 -0
  2. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/PKG-INFO +52 -10
  3. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/README.md +49 -9
  4. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/pyproject.toml +29 -2
  5. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/__init__.py +1 -1
  6. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/client.py +1 -1
  7. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/server.py +392 -18
  8. rootly_mcp_server-2.0.12/src/rootly_mcp_server/smart_utils.py +519 -0
  9. rootly_mcp_server-2.0.12/tests/README.md +297 -0
  10. rootly_mcp_server-2.0.12/tests/conftest.py +167 -0
  11. rootly_mcp_server-2.0.12/tests/integration/local/test_basic.py +221 -0
  12. rootly_mcp_server-2.0.12/tests/integration/local/test_smart_tools.py +328 -0
  13. rootly_mcp_server-2.0.12/tests/integration/remote/test_essential.py +398 -0
  14. rootly_mcp_server-2.0.12/tests/test_client.py +196 -0
  15. rootly_mcp_server-2.0.12/tests/unit/test_authentication.py +246 -0
  16. rootly_mcp_server-2.0.12/tests/unit/test_server.py +303 -0
  17. rootly_mcp_server-2.0.12/tests/unit/test_smart_utils.py +482 -0
  18. rootly_mcp_server-2.0.12/tests/unit/test_tools.py +73 -0
  19. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/uv.lock +362 -5
  20. rootly_mcp_server-2.0.10/rootly_fastmcp_server.py +0 -148
  21. rootly_mcp_server-2.0.10/rootly_fastmcp_server_routemap.py +0 -210
  22. rootly_mcp_server-2.0.10/rootly_openapi_loader.py +0 -96
  23. rootly_mcp_server-2.0.10/src/rootly_mcp_server/routemap_server.py +0 -206
  24. rootly_mcp_server-2.0.10/src/rootly_mcp_server/test_client.py +0 -150
  25. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.github/workflows/pypi-release.yml +0 -0
  26. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.gitignore +0 -0
  27. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.semaphore/deploy.yml +0 -0
  28. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.semaphore/semaphore.yml +0 -0
  29. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.semaphore/update-task-definition.sh +0 -0
  30. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/Dockerfile +0 -0
  31. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/LICENSE +0 -0
  32. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/rootly-mcp-server-demo.gif +0 -0
  33. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/rootly_openapi.json +0 -0
  34. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/__main__.py +0 -0
  35. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/data/__init__.py +0 -0
  36. {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/utils.py +0 -0
@@ -0,0 +1,71 @@
1
+ name: Tests
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ local-tests:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v4
10
+ - uses: astral-sh/setup-uv@v3
11
+ - run: uv python install 3.12 && uv sync --dev
12
+
13
+ # Fast local validation
14
+ - name: Code quality checks
15
+ run: |
16
+ uv run ruff check .
17
+ uv run pyright
18
+
19
+ - name: Unit tests
20
+ run: uv run pytest tests/unit/ --cov=src/rootly_mcp_server --cov-report=xml
21
+
22
+ - name: Local integration tests
23
+ env:
24
+ ROOTLY_API_TOKEN: ${{ secrets.ROOTLY_API_TOKEN }}
25
+ run: uv run pytest tests/integration/local/ -x
26
+
27
+ - name: Upload coverage
28
+ uses: codecov/codecov-action@v4
29
+ with:
30
+ file: ./coverage.xml
31
+
32
+ container-tests:
33
+ runs-on: ubuntu-latest
34
+ needs: local-tests
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - uses: astral-sh/setup-uv@v3
38
+ - run: uv python install 3.12 && uv sync --dev
39
+
40
+ # Build and run the Docker container
41
+ - name: Build Docker image
42
+ run: docker build -t rootly-mcp-server .
43
+
44
+ - name: Start MCP server container
45
+ env:
46
+ ROOTLY_API_TOKEN: ${{ secrets.ROOTLY_API_TOKEN }}
47
+ run: |
48
+ docker run -d \
49
+ --name rootly-mcp-server \
50
+ -p 8000:8000 \
51
+ -e ROOTLY_API_TOKEN="${ROOTLY_API_TOKEN}" \
52
+ rootly-mcp-server
53
+
54
+ # Wait for container to be ready
55
+ - name: Wait for container startup
56
+ run: |
57
+ echo "⏳ Waiting for container to start..."
58
+ timeout 30s bash -c 'until curl -f http://localhost:8000/health || curl -f http://localhost:8000/; do sleep 2; done'
59
+ echo "✅ Container is ready!"
60
+
61
+ # Test the containerized server
62
+ - name: Test containerized MCP server
63
+ env:
64
+ ROOTLY_API_TOKEN: ${{ secrets.ROOTLY_API_TOKEN }}
65
+ MCP_SERVER_URL: "http://localhost:8000"
66
+ run: uv run pytest tests/integration/remote/test_essential.py -v --timeout=60
67
+
68
+ # Cleanup
69
+ - name: Stop container
70
+ if: always()
71
+ run: docker stop rootly-mcp-server && docker rm rootly-mcp-server
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rootly-mcp-server
3
- Version: 2.0.10
3
+ Version: 2.0.12
4
4
  Summary: A Model Context Protocol server for Rootly APIs using OpenAPI spec
5
5
  Project-URL: Homepage, https://github.com/Rootly-AI-Labs/Rootly-MCP-server
6
6
  Project-URL: Issues, https://github.com/Rootly-AI-Labs/Rootly-MCP-server/issues
@@ -17,8 +17,10 @@ Requires-Python: >=3.12
17
17
  Requires-Dist: brotli>=1.0.0
18
18
  Requires-Dist: fastmcp>=2.9.0
19
19
  Requires-Dist: httpx>=0.24.0
20
+ Requires-Dist: numpy>=1.24.0
20
21
  Requires-Dist: pydantic>=2.0.0
21
22
  Requires-Dist: requests>=2.28.0
23
+ Requires-Dist: scikit-learn>=1.3.0
22
24
  Provides-Extra: dev
23
25
  Requires-Dist: black>=23.0.0; extra == 'dev'
24
26
  Requires-Dist: isort>=5.0.0; extra == 'dev'
@@ -43,9 +45,7 @@ An MCP server for the [Rootly API](https://docs.rootly.com/api-reference/overvie
43
45
 
44
46
  ## Installation
45
47
 
46
- Install via our [PyPi package](https://pypi.org/project/rootly-mcp-server/) or by cloning this repository.
47
-
48
- Configure your MCP-compatible editor (tested with Cursor and Windsurf) with the following:
48
+ Configure your MCP-compatible editor (tested with Cursor) with one of the configurations below. The package will be automatically downloaded and installed when you first open your editor.
49
49
 
50
50
  ### With uv
51
51
 
@@ -69,7 +69,7 @@ Configure your MCP-compatible editor (tested with Cursor and Windsurf) with the
69
69
  }
70
70
  ```
71
71
 
72
- ### With uv-tool-uvx
72
+ ### With uvx
73
73
 
74
74
  ```json
75
75
  {
@@ -139,6 +139,11 @@ Alternatively, connect directly to our hosted MCP server:
139
139
  - **Dynamic Tool Generation**: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
140
140
  - **Smart Pagination**: Defaults to 10 items per request for incident endpoints to prevent context window overflow
141
141
  - **API Filtering**: Limits exposed API endpoints for security and performance
142
+ - **AI-Powered Incident Analysis**: Smart tools that learn from historical incident data
143
+ - **`find_related_incidents`**: Uses TF-IDF similarity analysis to find historically similar incidents
144
+ - **`suggest_solutions`**: Mines past incident resolutions to recommend actionable solutions
145
+ - **MCP Resources**: Exposes incident and team data as structured resources for easy AI reference
146
+ - **Intelligent Pattern Recognition**: Automatically identifies services, error types, and resolution patterns
142
147
 
143
148
  ### Whitelisted Endpoints
144
149
 
@@ -180,10 +185,49 @@ By default, the following Rootly API endpoints are exposed to the AI agent (see
180
185
  We limit exposed API paths for two key reasons:
181
186
 
182
187
  1. **Context Management**: Rootly's comprehensive API can overwhelm AI agents, affecting their ability to perform simple tasks effectively
183
- 2. **Security**: Control which information and actions are accessible through the MCP server
188
+ 2. **Security**: Controls which information and actions are accessible through the MCP server
184
189
 
185
190
  To expose additional paths, modify the `allowed_paths` variable in `src/rootly_mcp_server/server.py`.
186
191
 
192
+ ### AI-Powered Smart Tools
193
+
194
+ The MCP server includes intelligent tools that analyze historical incident data to provide actionable insights:
195
+
196
+ #### `find_related_incidents`
197
+ Finds historically similar incidents using machine learning text analysis:
198
+ ```
199
+ find_related_incidents(incident_id="12345", similarity_threshold=0.3, max_results=5)
200
+ ```
201
+ - **Input**: Incident ID, similarity threshold (0.0-1.0), max results
202
+ - **Output**: Similar incidents with confidence scores, matched services, and resolution times
203
+ - **Use Case**: Get context from past incidents to understand patterns and solutions
204
+
205
+ #### `suggest_solutions`
206
+ Recommends solutions by analyzing how similar incidents were resolved:
207
+ ```
208
+ suggest_solutions(incident_id="12345", max_solutions=3)
209
+ # OR for new incidents:
210
+ suggest_solutions(incident_title="Payment API errors", incident_description="Users getting 500 errors during checkout")
211
+ ```
212
+ - **Input**: Either incident ID OR title/description text
213
+ - **Output**: Actionable solution recommendations with confidence scores and time estimates
214
+ - **Use Case**: Get AI-powered suggestions based on successful past resolutions
215
+
216
+ #### How It Works
217
+ - **Text Similarity**: Uses TF-IDF vectorization and cosine similarity (scikit-learn)
218
+ - **Service Detection**: Automatically identifies affected services from incident text
219
+ - **Pattern Recognition**: Finds common error types, resolution patterns, and time estimates
220
+ - **Fallback Mode**: Works without ML libraries using keyword-based similarity
221
+ - **Solution Mining**: Extracts actionable steps from resolution summaries
222
+
223
+ #### Data Requirements
224
+ For optimal results, ensure your Rootly incidents have descriptive:
225
+ - **Titles**: Clear, specific incident descriptions
226
+ - **Summaries**: Detailed resolution steps when closing incidents
227
+ - **Service Tags**: Proper service identification
228
+
229
+ Example good resolution summary: `"Restarted auth-service, cleared Redis cache, and increased connection pool from 10 to 50"`
230
+
187
231
  ## About Rootly AI Labs
188
232
 
189
233
  This project was developed by [Rootly AI Labs](https://labs.rootly.ai/), where we're building the future of system reliability and operational excellence. As an open-source incubator, we share ideas, experiment, and rapidly prototype solutions that benefit the entire community.
@@ -219,9 +263,7 @@ uv pip install <package>
219
263
 
220
264
  ### 3. Verify Installation
221
265
 
222
- Run the test client to ensure everything is configured correctly:
266
+ The server should now be ready to use with your MCP-compatible editor.
223
267
 
224
- ```bash
225
- python src/rootly_mcp_server/test_client.py
226
- ```
268
+ **For developers:** Additional testing tools are available in the `tests/` directory.
227
269
 
@@ -17,9 +17,7 @@ An MCP server for the [Rootly API](https://docs.rootly.com/api-reference/overvie
17
17
 
18
18
  ## Installation
19
19
 
20
- Install via our [PyPi package](https://pypi.org/project/rootly-mcp-server/) or by cloning this repository.
21
-
22
- Configure your MCP-compatible editor (tested with Cursor and Windsurf) with the following:
20
+ Configure your MCP-compatible editor (tested with Cursor) with one of the configurations below. The package will be automatically downloaded and installed when you first open your editor.
23
21
 
24
22
  ### With uv
25
23
 
@@ -43,7 +41,7 @@ Configure your MCP-compatible editor (tested with Cursor and Windsurf) with the
43
41
  }
44
42
  ```
45
43
 
46
- ### With uv-tool-uvx
44
+ ### With uvx
47
45
 
48
46
  ```json
49
47
  {
@@ -113,6 +111,11 @@ Alternatively, connect directly to our hosted MCP server:
113
111
  - **Dynamic Tool Generation**: Automatically creates MCP resources from Rootly's OpenAPI (Swagger) specification
114
112
  - **Smart Pagination**: Defaults to 10 items per request for incident endpoints to prevent context window overflow
115
113
  - **API Filtering**: Limits exposed API endpoints for security and performance
114
+ - **AI-Powered Incident Analysis**: Smart tools that learn from historical incident data
115
+ - **`find_related_incidents`**: Uses TF-IDF similarity analysis to find historically similar incidents
116
+ - **`suggest_solutions`**: Mines past incident resolutions to recommend actionable solutions
117
+ - **MCP Resources**: Exposes incident and team data as structured resources for easy AI reference
118
+ - **Intelligent Pattern Recognition**: Automatically identifies services, error types, and resolution patterns
116
119
 
117
120
  ### Whitelisted Endpoints
118
121
 
@@ -154,10 +157,49 @@ By default, the following Rootly API endpoints are exposed to the AI agent (see
154
157
  We limit exposed API paths for two key reasons:
155
158
 
156
159
  1. **Context Management**: Rootly's comprehensive API can overwhelm AI agents, affecting their ability to perform simple tasks effectively
157
- 2. **Security**: Control which information and actions are accessible through the MCP server
160
+ 2. **Security**: Controls which information and actions are accessible through the MCP server
158
161
 
159
162
  To expose additional paths, modify the `allowed_paths` variable in `src/rootly_mcp_server/server.py`.
160
163
 
164
+ ### AI-Powered Smart Tools
165
+
166
+ The MCP server includes intelligent tools that analyze historical incident data to provide actionable insights:
167
+
168
+ #### `find_related_incidents`
169
+ Finds historically similar incidents using machine learning text analysis:
170
+ ```
171
+ find_related_incidents(incident_id="12345", similarity_threshold=0.3, max_results=5)
172
+ ```
173
+ - **Input**: Incident ID, similarity threshold (0.0-1.0), max results
174
+ - **Output**: Similar incidents with confidence scores, matched services, and resolution times
175
+ - **Use Case**: Get context from past incidents to understand patterns and solutions
176
+
177
+ #### `suggest_solutions`
178
+ Recommends solutions by analyzing how similar incidents were resolved:
179
+ ```
180
+ suggest_solutions(incident_id="12345", max_solutions=3)
181
+ # OR for new incidents:
182
+ suggest_solutions(incident_title="Payment API errors", incident_description="Users getting 500 errors during checkout")
183
+ ```
184
+ - **Input**: Either incident ID OR title/description text
185
+ - **Output**: Actionable solution recommendations with confidence scores and time estimates
186
+ - **Use Case**: Get AI-powered suggestions based on successful past resolutions
187
+
188
+ #### How It Works
189
+ - **Text Similarity**: Uses TF-IDF vectorization and cosine similarity (scikit-learn)
190
+ - **Service Detection**: Automatically identifies affected services from incident text
191
+ - **Pattern Recognition**: Finds common error types, resolution patterns, and time estimates
192
+ - **Fallback Mode**: Works without ML libraries using keyword-based similarity
193
+ - **Solution Mining**: Extracts actionable steps from resolution summaries
194
+
195
+ #### Data Requirements
196
+ For optimal results, ensure your Rootly incidents have descriptive:
197
+ - **Titles**: Clear, specific incident descriptions
198
+ - **Summaries**: Detailed resolution steps when closing incidents
199
+ - **Service Tags**: Proper service identification
200
+
201
+ Example good resolution summary: `"Restarted auth-service, cleared Redis cache, and increased connection pool from 10 to 50"`
202
+
161
203
  ## About Rootly AI Labs
162
204
 
163
205
  This project was developed by [Rootly AI Labs](https://labs.rootly.ai/), where we're building the future of system reliability and operational excellence. As an open-source incubator, we share ideas, experiment, and rapidly prototype solutions that benefit the entire community.
@@ -193,9 +235,7 @@ uv pip install <package>
193
235
 
194
236
  ### 3. Verify Installation
195
237
 
196
- Run the test client to ensure everything is configured correctly:
238
+ The server should now be ready to use with your MCP-compatible editor.
197
239
 
198
- ```bash
199
- python src/rootly_mcp_server/test_client.py
200
- ```
240
+ **For developers:** Additional testing tools are available in the `tests/` directory.
201
241
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rootly-mcp-server"
3
- version = "2.0.10"
3
+ version = "2.0.12"
4
4
  description = "A Model Context Protocol server for Rootly APIs using OpenAPI spec"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -21,6 +21,8 @@ dependencies = [
21
21
  "httpx>=0.24.0", # For async HTTP client
22
22
  "pydantic>=2.0.0", # For data validation
23
23
  "brotli>=1.0.0", # For Brotli compression support in httpx
24
+ "scikit-learn>=1.3.0", # For text similarity and ML utilities
25
+ "numpy>=1.24.0", # For numerical operations
24
26
  ]
25
27
 
26
28
  [project.urls]
@@ -50,10 +52,35 @@ rootly-mcp-server = "rootly_mcp_server.__main__:main"
50
52
  dev = ["black>=23.0.0", "isort>=5.0.0"]
51
53
 
52
54
  [tool.uv]
53
- dev-dependencies = ["pyright>=1.1.389", "ruff>=0.7.3", "pytest>=8.0.0"]
55
+ dev-dependencies = [
56
+ "pyright>=1.1.404",
57
+ "ruff>=0.7.3",
58
+ "pytest>=8.0.0",
59
+ "pytest-cov>=4.0.0", # Coverage reporting
60
+ "pytest-asyncio>=0.23.0", # Async testing support
61
+ "pytest-mock>=3.12.0", # Mocking utilities
62
+ "pytest-timeout>=2.2.0", # Test timeout handling
63
+ "respx>=0.20.0", # HTTP request mocking
64
+ "sseclient-py>=1.8.0", # Server-Sent Events client for remote tests
65
+ ]
54
66
 
55
67
  [tool.pytest.ini_options]
56
68
  testpaths = ["tests"]
57
69
  python_files = "test_*.py"
58
70
  python_classes = "Test*"
59
71
  python_functions = "test_*"
72
+ addopts = [
73
+ "-v", # Verbose output
74
+ "--strict-markers", # Require marker registration
75
+ "--tb=short", # Short traceback format
76
+ "--cov=src/rootly_mcp_server", # Coverage for main package
77
+ "--cov-report=term-missing", # Show missing lines in coverage
78
+ "--cov-report=xml", # XML coverage for CI
79
+ ]
80
+ markers = [
81
+ "unit: Unit tests",
82
+ "integration: Integration tests",
83
+ "remote: Remote server tests (require API token)",
84
+ "slow: Tests that take longer to run",
85
+ ]
86
+ asyncio_mode = "auto" # Auto-detect async tests
@@ -13,7 +13,7 @@ Features:
13
13
  from .server import RootlyMCPServer
14
14
  from .client import RootlyClient
15
15
 
16
- __version__ = "2.0.1"
16
+ __version__ = "2.0.12"
17
17
  __all__ = [
18
18
  'RootlyMCPServer',
19
19
  'RootlyClient',
@@ -121,7 +121,7 @@ class RootlyClient:
121
121
  # Add response details if available
122
122
  if hasattr(e, "response") and e.response is not None:
123
123
  try:
124
- error_response["status_code"] = e.response.status_code
124
+ error_response["status_code"] = str(e.response.status_code)
125
125
  error_response["response_text"] = e.response.text
126
126
  except Exception:
127
127
  pass