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

1# Get logger for this module 

2from typing import Any 

3 

4from qdrant_loader_core.logging import LoggingConfig 

5 

6logger = LoggingConfig.get_logger("src.mcp.intelligence_handler") 

7 

8 

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 """ 

15 

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 ) 

26 

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 ) 

32 

33 depth = params.get("depth") 

34 ticket_key = params.get("ticket_key") 

35 

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 ) 

46 

47 query_params = { 

48 "ticket_key": ticket_key, 

49 "depth": depth, 

50 } 

51 try: 

52 depth = self._validate_depth(depth) 

53 

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 """ 

63 

64 result = await self._run_graph_query(query, query_params) 

65 

66 formatted = self.formatters.format_graph(result) 

67 

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 ) 

84 

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 ) 

94 

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 )