rootly-mcp-server 2.2.1__py3-none-any.whl → 2.2.3__py3-none-any.whl
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/__init__.py +6 -1
- rootly_mcp_server/server.py +42 -5
- {rootly_mcp_server-2.2.1.dist-info → rootly_mcp_server-2.2.3.dist-info}/METADATA +1 -1
- {rootly_mcp_server-2.2.1.dist-info → rootly_mcp_server-2.2.3.dist-info}/RECORD +7 -7
- {rootly_mcp_server-2.2.1.dist-info → rootly_mcp_server-2.2.3.dist-info}/WHEEL +0 -0
- {rootly_mcp_server-2.2.1.dist-info → rootly_mcp_server-2.2.3.dist-info}/entry_points.txt +0 -0
- {rootly_mcp_server-2.2.1.dist-info → rootly_mcp_server-2.2.3.dist-info}/licenses/LICENSE +0 -0
rootly_mcp_server/__init__.py
CHANGED
|
@@ -14,10 +14,15 @@ Features:
|
|
|
14
14
|
- Input validation and sensitive data masking
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
18
|
+
|
|
17
19
|
from .client import RootlyClient
|
|
18
20
|
from .server import RootlyMCPServer
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
try:
|
|
23
|
+
__version__ = version("rootly-mcp-server")
|
|
24
|
+
except PackageNotFoundError:
|
|
25
|
+
__version__ = "dev"
|
|
21
26
|
__all__ = [
|
|
22
27
|
"RootlyMCPServer",
|
|
23
28
|
"RootlyClient",
|
rootly_mcp_server/server.py
CHANGED
|
@@ -386,18 +386,41 @@ class AuthenticatedHTTPXClient:
|
|
|
386
386
|
if "params" in kwargs:
|
|
387
387
|
kwargs["params"] = self._transform_params(kwargs["params"])
|
|
388
388
|
|
|
389
|
+
# Log incoming headers for debugging (before transformation)
|
|
390
|
+
incoming_headers = kwargs.get("headers", {})
|
|
391
|
+
if incoming_headers:
|
|
392
|
+
logger.debug(f"Incoming headers for {method} {url}: {list(incoming_headers.keys())}")
|
|
393
|
+
|
|
389
394
|
# ALWAYS ensure Content-Type and Accept headers are set correctly for Rootly API
|
|
390
395
|
# This is critical because:
|
|
391
|
-
# 1. FastMCP
|
|
392
|
-
# 2.
|
|
393
|
-
# 3.
|
|
396
|
+
# 1. FastMCP's get_http_headers() returns LOWERCASE header keys (e.g., "content-type")
|
|
397
|
+
# 2. We must remove any existing content-type/accept and set the correct JSON-API values
|
|
398
|
+
# 3. Handle both lowercase and mixed-case variants to be safe
|
|
394
399
|
headers = dict(kwargs.get("headers") or {})
|
|
400
|
+
# Remove any existing content-type and accept headers (case-insensitive)
|
|
401
|
+
headers_to_remove = [k for k in headers if k.lower() in ("content-type", "accept")]
|
|
402
|
+
for key in headers_to_remove:
|
|
403
|
+
logger.debug(f"Removing header '{key}' with value '{headers[key]}'")
|
|
404
|
+
del headers[key]
|
|
405
|
+
# Set the correct JSON-API headers
|
|
395
406
|
headers["Content-Type"] = "application/vnd.api+json"
|
|
396
407
|
headers["Accept"] = "application/vnd.api+json"
|
|
397
408
|
kwargs["headers"] = headers
|
|
398
409
|
|
|
399
|
-
#
|
|
400
|
-
|
|
410
|
+
# Log outgoing request
|
|
411
|
+
logger.debug(f"Request: {method} {url}")
|
|
412
|
+
|
|
413
|
+
response = await self.client.request(method, url, **kwargs)
|
|
414
|
+
logger.debug(f"Response: {method} {url} -> {response.status_code}")
|
|
415
|
+
|
|
416
|
+
# Log error responses (4xx/5xx)
|
|
417
|
+
if response.is_error:
|
|
418
|
+
logger.error(
|
|
419
|
+
f"HTTP {response.status_code} error for {method} {url}: "
|
|
420
|
+
f"{response.text[:500] if response.text else 'No response body'}"
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
return response
|
|
401
424
|
|
|
402
425
|
async def get(self, url: str, **kwargs):
|
|
403
426
|
"""Proxy to request with GET method."""
|
|
@@ -543,6 +566,20 @@ def create_rootly_mcp_server(
|
|
|
543
566
|
|
|
544
567
|
return endpoints
|
|
545
568
|
|
|
569
|
+
@mcp.tool()
|
|
570
|
+
def get_server_version() -> dict:
|
|
571
|
+
"""Get the Rootly MCP server version.
|
|
572
|
+
|
|
573
|
+
Returns the current version of the deployed MCP server.
|
|
574
|
+
Useful for checking if the server has been updated.
|
|
575
|
+
"""
|
|
576
|
+
from rootly_mcp_server import __version__
|
|
577
|
+
|
|
578
|
+
return {
|
|
579
|
+
"version": __version__,
|
|
580
|
+
"package": "rootly-mcp-server",
|
|
581
|
+
}
|
|
582
|
+
|
|
546
583
|
async def make_authenticated_request(method: str, url: str, **kwargs):
|
|
547
584
|
"""Make an authenticated request, extracting token from MCP headers in hosted mode."""
|
|
548
585
|
# In hosted mode, get token from MCP request headers
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rootly-mcp-server
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.3
|
|
4
4
|
Summary: Secure Model Context Protocol server for Rootly APIs with AI SRE capabilities, comprehensive error handling, and input validation
|
|
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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
rootly_mcp_server/__init__.py,sha256=
|
|
1
|
+
rootly_mcp_server/__init__.py,sha256=gVb0QKxeezBs9AeLpItWcUPem4gVQkSao89yOxSQ9j4,1018
|
|
2
2
|
rootly_mcp_server/__main__.py,sha256=mt74vaOpfHnX5rTO0CFAeulatR_9K3NBNCaLAhBLxlc,6886
|
|
3
3
|
rootly_mcp_server/client.py,sha256=Qca2R9cgBxXcyobQj4RHl8gdxLB4Jphq0RIr61DAVKw,6542
|
|
4
4
|
rootly_mcp_server/exceptions.py,sha256=67J_wlfOICg87eUipbkARzn_6u_Io82L-5cVnk2UPr0,4504
|
|
@@ -6,14 +6,14 @@ rootly_mcp_server/monitoring.py,sha256=k1X7vK65FOTrCrOsLUXrFm6AJxKpXt_a0PzL6xdPu
|
|
|
6
6
|
rootly_mcp_server/och_client.py,sha256=6UBP7MLkaDOGcJ78hQgSqTyrtr41XwDTqOOfUnoMJkc,2861
|
|
7
7
|
rootly_mcp_server/pagination.py,sha256=2hZSO4DLUEJZbdF8oDfIt2_7X_XGBG1jIxN8VGmeJBE,2420
|
|
8
8
|
rootly_mcp_server/security.py,sha256=YkMoVALZ3XaKnMu3yF5kVf3SW_jdKHllSMwVLk1OlX0,11556
|
|
9
|
-
rootly_mcp_server/server.py,sha256=
|
|
9
|
+
rootly_mcp_server/server.py,sha256=CurzboZoxqqiwda66gB6pUMLDzqnQLpTPqAVMP65DeI,165238
|
|
10
10
|
rootly_mcp_server/smart_utils.py,sha256=c7S-8H151GfmDw6dZBDdLH_cCmR1qiXkKEYSKc0WwUY,23481
|
|
11
11
|
rootly_mcp_server/texttest.json,sha256=KV9m13kWugmW1VEpU80Irp50uCcLgJtV1YT-JzMogQg,154182
|
|
12
12
|
rootly_mcp_server/utils.py,sha256=TWG1MaaFKrU1phRhU6FgHuZAEv91JOe_1w0L2OrPJMY,4406
|
|
13
13
|
rootly_mcp_server/validators.py,sha256=z1Lvel2SpOFLo1cPdQGSrX2ySt6zqR42w0R6QV9c2Cc,4092
|
|
14
14
|
rootly_mcp_server/data/__init__.py,sha256=KdWD6hiRssHXt0Ywgj3wjNHY1sx-XSPEqVHqrTArf54,143
|
|
15
|
-
rootly_mcp_server-2.2.
|
|
16
|
-
rootly_mcp_server-2.2.
|
|
17
|
-
rootly_mcp_server-2.2.
|
|
18
|
-
rootly_mcp_server-2.2.
|
|
19
|
-
rootly_mcp_server-2.2.
|
|
15
|
+
rootly_mcp_server-2.2.3.dist-info/METADATA,sha256=5Kgt7YDxy9AqRGOx-K7RZoKm3f4hl6k-fOz6Ai7-HxI,9907
|
|
16
|
+
rootly_mcp_server-2.2.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
17
|
+
rootly_mcp_server-2.2.3.dist-info/entry_points.txt,sha256=NE33b8VgigVPGBkboyo6pvN1Vz35HZtLybxMO4Q03PI,70
|
|
18
|
+
rootly_mcp_server-2.2.3.dist-info/licenses/LICENSE,sha256=c9w9ZZGl14r54tsP40oaq5adTVX_HMNHozPIH2ymzmw,11341
|
|
19
|
+
rootly_mcp_server-2.2.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|