Coverage for src/qdrant_loader_mcp_server/mcp/graph_handler.py: 96%
27 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-20 10:15 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-20 10:15 +0000
1# Get logger for this module
2from typing import Any
4from qdrant_loader_core.logging import LoggingConfig
6logger = LoggingConfig.get_logger("src.mcp.intelligence_handler")
9async def handle_find_ticket_dependencies(
10 self, request_id: str | int | None, params: dict[str, Any]
11):
12 """
13 Traverse Jira blocking dependencies
14 """
16 if "ticket_key" not in params:
17 logger.error("Missing required parameter: ticket_key")
18 return self.protocol.create_response(
19 request_id,
20 error={
21 "code": -32602,
22 "message": "Invalid params",
23 "data": "Missing required parameter: ticket_key",
24 },
25 )
27 if "depth" not in params:
28 logger.error("Missing required parameter: depth")
29 return self.protocol.create_response(
30 request_id, error={"code": -32602, "message": "Invalid params"}
31 )
33 depth = params.get("depth")
34 ticket_key = params.get("ticket_key")
36 if not isinstance(depth, int):
37 logger.error("Invalid depth parameter type")
38 return self.protocol.create_response(
39 request_id,
40 error={
41 "code": -32602,
42 "message": "Invalid params",
43 "data": "depth must be an integer",
44 },
45 )
47 query_params = {
48 "ticket_key": ticket_key,
49 "depth": depth,
50 }
51 try:
52 depth = self._validate_depth(depth)
54 query = f"""
55 MATCH path =
56 (start:Document {{id: $ticket_key}})
57 -[:LINKS_TO*1..{depth}]->
58 (target)
59 RETURN
60 nodes(path),
61 relationships(path)
62 """
64 result = await self._run_graph_query(query, query_params)
66 formatted = self.formatters.format_graph(result)
68 return self.protocol.create_response(
69 request_id,
70 result={
71 "content": [
72 {
73 "type": "text",
74 "text": (
75 f"Found {len(formatted.get('nodes', []))} "
76 f"nodes and {len(formatted.get('edges', []))} edges"
77 ),
78 }
79 ],
80 "structuredContent": formatted,
81 "isError": False,
82 },
83 )
85 except ValueError as e:
86 return self.protocol.create_response(
87 request_id,
88 error={
89 "code": -32602,
90 "message": "Invalid params",
91 "data": str(e),
92 },
93 )
95 except Exception:
96 logger.exception("Error querying graph")
97 return self.protocol.create_response(
98 request_id,
99 error={
100 "code": -32603,
101 "message": "Internal server error",
102 },
103 )