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.
- rootly_mcp_server-2.0.12/.github/workflows/test.yml +71 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/PKG-INFO +52 -10
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/README.md +49 -9
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/pyproject.toml +29 -2
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/__init__.py +1 -1
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/client.py +1 -1
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/server.py +392 -18
- rootly_mcp_server-2.0.12/src/rootly_mcp_server/smart_utils.py +519 -0
- rootly_mcp_server-2.0.12/tests/README.md +297 -0
- rootly_mcp_server-2.0.12/tests/conftest.py +167 -0
- rootly_mcp_server-2.0.12/tests/integration/local/test_basic.py +221 -0
- rootly_mcp_server-2.0.12/tests/integration/local/test_smart_tools.py +328 -0
- rootly_mcp_server-2.0.12/tests/integration/remote/test_essential.py +398 -0
- rootly_mcp_server-2.0.12/tests/test_client.py +196 -0
- rootly_mcp_server-2.0.12/tests/unit/test_authentication.py +246 -0
- rootly_mcp_server-2.0.12/tests/unit/test_server.py +303 -0
- rootly_mcp_server-2.0.12/tests/unit/test_smart_utils.py +482 -0
- rootly_mcp_server-2.0.12/tests/unit/test_tools.py +73 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/uv.lock +362 -5
- rootly_mcp_server-2.0.10/rootly_fastmcp_server.py +0 -148
- rootly_mcp_server-2.0.10/rootly_fastmcp_server_routemap.py +0 -210
- rootly_mcp_server-2.0.10/rootly_openapi_loader.py +0 -96
- rootly_mcp_server-2.0.10/src/rootly_mcp_server/routemap_server.py +0 -206
- rootly_mcp_server-2.0.10/src/rootly_mcp_server/test_client.py +0 -150
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.github/workflows/pypi-release.yml +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.gitignore +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.semaphore/deploy.yml +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.semaphore/semaphore.yml +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/.semaphore/update-task-definition.sh +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/Dockerfile +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/LICENSE +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/rootly-mcp-server-demo.gif +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/rootly_openapi.json +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/__main__.py +0 -0
- {rootly_mcp_server-2.0.10 → rootly_mcp_server-2.0.12}/src/rootly_mcp_server/data/__init__.py +0 -0
- {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.
|
|
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
|
-
|
|
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
|
|
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**:
|
|
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
|
-
|
|
266
|
+
The server should now be ready to use with your MCP-compatible editor.
|
|
223
267
|
|
|
224
|
-
|
|
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
|
-
|
|
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
|
|
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**:
|
|
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
|
-
|
|
238
|
+
The server should now be ready to use with your MCP-compatible editor.
|
|
197
239
|
|
|
198
|
-
|
|
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.
|
|
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 = [
|
|
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
|
|
@@ -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
|