1313
1414logger = logging .getLogger (__name__ )
1515
16+
17+ def _log_api_event (
18+ tag : str ,
19+ client_ip : str ,
20+ action : str ,
21+ path : str ,
22+ reason : Optional [str ] = None ,
23+ ) -> None :
24+ if reason :
25+ logger .info ('%s %s "%s %s (%s)"' , tag , client_ip , action , path , reason )
26+ return
27+ logger .info ('%s %s "%s %s"' , tag , client_ip , action , path )
28+
29+
30+ def _describe_http_error (error : requests .exceptions .HTTPError ) -> str :
31+ response = error .response
32+ if response is None :
33+ return "api error"
34+
35+ reason_parts = [f"api { response .status_code } " ]
36+ if response .reason :
37+ reason_parts .append (str (response .reason ).lower ())
38+
39+ try :
40+ payload = response .json ()
41+ except ValueError :
42+ payload = None
43+
44+ if isinstance (payload , dict ):
45+ detail = payload .get ("message" ) or payload .get ("error" )
46+ if detail :
47+ reason_parts .append (str (detail ).strip ())
48+
49+ return " - " .join (reason_parts )
50+
51+
52+ def _describe_request_exception (error : requests .exceptions .RequestException ) -> str :
53+ if isinstance (error , requests .exceptions .Timeout ):
54+ return "timeout"
55+ if isinstance (error , requests .exceptions .ConnectionError ):
56+ return "connection failed"
57+ return str (error ).strip () or "request failed"
58+
1659# Create the MCP server instance
1760mcp = FastMCP (
1861 name = "Openapi.com MCP Gateway" ,
@@ -74,7 +117,6 @@ def make_api_call(ctx: Context, method: str, url: str, json_payload: Optional[di
74117 except Exception :
75118 client_ip = "?"
76119 tag = f"[{ service } ]"
77- logger .info ('%s %s "%s %s"' , tag , client_ip , method , parsed .path )
78120 # Attempt to retrieve the Authorization header from multiple sources
79121 try :
80122 auth_header = None
@@ -104,8 +146,10 @@ def make_api_call(ctx: Context, method: str, url: str, json_payload: Optional[di
104146 raise ValueError ("Missing or malformed Header 'Authorization: Bearer <token>'." )
105147
106148 except Exception as e :
149+ _log_api_event (tag , client_ip , "ERROR" , parsed .path , "token mancante" )
107150 return ApiError (error = "Auth Error" , message = f"Missing Token from client: { e } " ).model_dump ()
108151
152+ _log_api_event (tag , client_ip , method , parsed .path )
109153 headers = {"Authorization" : auth_header , ** kwargs .pop ("headers" , {})}
110154 try :
111155 request_args = dict (method = method , url = url , headers = headers , ** kwargs )
@@ -126,8 +170,22 @@ def make_api_call(ctx: Context, method: str, url: str, json_payload: Optional[di
126170 return return_data
127171 return response_data
128172 except requests .exceptions .HTTPError as e :
173+ _log_api_event (
174+ tag ,
175+ client_ip ,
176+ "ERROR" ,
177+ parsed .path ,
178+ _describe_http_error (e ),
179+ )
129180 error_details = e .response .text
130181 return e .response .json ()
131182 return ApiError (error = "API HTTP Error" , message = f"{ e .response .status_code } : { error_details } " ).model_dump ()
132183 except requests .exceptions .RequestException as e :
184+ _log_api_event (
185+ tag ,
186+ client_ip ,
187+ "ERROR" ,
188+ parsed .path ,
189+ _describe_request_exception (e ),
190+ )
133191 return ApiError (error = "API Request Error" , message = str (e )).model_dump ()
0 commit comments