11"""Repository overview tool for CodeAlive MCP server."""
22
33from typing import Optional
4+ from urllib .parse import urljoin
45from xml .etree import ElementTree as ET
56
6- from mcp .server .fastmcp import Context
7+ import httpx
8+ from fastmcp import Context
79
8- from core .config import get_api_key_from_context
9- from core .logging import log_api_request , log_api_response , logger
10- from utils .errors import (
10+ from core import CodeAliveContext , get_api_key_from_context , log_api_request , log_api_response
11+ from utils import (
1112 handle_api_error ,
1213 normalize_data_source_names ,
1314 format_data_source_names ,
1415)
15- import httpx
1616
1717
1818async def get_repo_overview (
@@ -66,32 +66,38 @@ async def get_repo_overview(
6666 # </repository>
6767 # </repository_overviews>
6868 """
69+ context : CodeAliveContext = ctx .request_context .lifespan_context
70+
6971 try :
70- # Get context and API key
71- context = ctx .request_context .lifespan_context
7272 api_key = get_api_key_from_context (ctx )
7373
74- # Normalize and format data_sources if provided
75- data_sources = normalize_data_source_names (data_sources )
74+ # Normalize data_sources (handles Claude Desktop serialization issues)
75+ data_source_names = normalize_data_source_names (data_sources )
7676
77- # Build request URL and params
78- url = f"{ context .base_url } /api/overview"
77+ # Build request params
7978 params = {}
80-
81- if data_sources :
82- formatted_names = format_data_source_names (data_sources )
79+ if data_source_names and len (data_source_names ) > 0 :
80+ formatted_names = format_data_source_names (data_source_names )
8381 params = formatted_names
8482
85- # Log and execute GET request
86- log_api_request (logger , "GET" , url , params )
87-
83+ # Prepare headers
8884 headers = {"Authorization" : f"Bearer { api_key } " }
89- response = await context .client .get (url , headers = headers , params = params )
85+
86+ # Log the request
87+ endpoint = "/api/overview"
88+ full_url = urljoin (context .base_url , endpoint )
89+ request_id = log_api_request ("GET" , full_url , headers , params = params )
90+
91+ # Make API request
92+ response = await context .client .get (endpoint , headers = headers , params = params )
93+
94+ # Log the response
95+ log_api_response (response , request_id )
96+
9097 response .raise_for_status ()
9198
9299 # Parse JSON response
93100 overview_data = response .json ()
94- log_api_response (logger , response .status_code , overview_data )
95101
96102 # Transform to XML format
97103 root = ET .Element ("repository_overviews" )
@@ -108,7 +114,5 @@ async def get_repo_overview(
108114
109115 return xml_string
110116
111- except httpx .HTTPError as e :
112- return handle_api_error (ctx , e , "get repository overview" )
113- except Exception as e :
114- return handle_api_error (ctx , e , "get repository overview" )
117+ except (httpx .HTTPStatusError , Exception ) as e :
118+ return await handle_api_error (ctx , e , "get repository overview" )
0 commit comments