@@ -16,6 +16,10 @@ const unlocker_zone = process.env.WEB_UNLOCKER_ZONE || 'mcp_unlocker';
1616const browser_zone = process . env . BROWSER_ZONE || 'mcp_browser' ;
1717const pro_mode = process . env . PRO_MODE === 'true' ;
1818const polling_timeout = parseInt ( process . env . POLLING_TIMEOUT || '600' , 10 ) ;
19+ const base_timeout = process . env . BASE_TIMEOUT
20+ ? parseInt ( process . env . BASE_TIMEOUT , 10 ) * 1000 : 0 ;
21+ const base_max_retries = Math . min (
22+ parseInt ( process . env . BASE_MAX_RETRIES || '0' , 10 ) , 3 ) ;
1923const pro_mode_tools = [ 'search_engine' , 'scrape_as_markdown' ,
2024 'search_engine_batch' , 'scrape_batch' ] ;
2125const tool_groups = process . env . GROUPS ?
@@ -64,6 +68,24 @@ const rate_limit_config = parse_rate_limit(process.env.RATE_LIMIT);
6468if ( ! api_token )
6569 throw new Error ( 'Cannot run MCP server without API_TOKEN env' ) ;
6670
71+ async function base_request ( config ) {
72+ let last_err ;
73+ for ( let attempt = 0 ; attempt <= base_max_retries ; attempt ++ )
74+ {
75+ try {
76+ return await axios ( { ...config , timeout : base_timeout } ) ;
77+ } catch ( e ) {
78+ last_err = e ;
79+ if ( e . response ?. status && e . response . status >= 400
80+ && e . response . status < 500 )
81+ {
82+ throw e ;
83+ }
84+ }
85+ }
86+ throw last_err ;
87+ }
88+
6789const api_headers = ( clientName = null , tool_name = null ) => ( {
6890 'user-agent' : `${ package_json . name } /${ package_json . version } ` ,
6991 authorization : `Bearer ${ api_token } ` ,
@@ -202,7 +224,7 @@ addTool({
202224 {
203225 const is_google = engine == 'google' ;
204226 const url = search_url ( engine , query , cursor , geo_location ) ;
205- let response = await axios ( {
227+ let response = await base_request ( {
206228 url : 'https://api.brightdata.com/request' ,
207229 method : 'POST' ,
208230 data : {
@@ -241,7 +263,7 @@ addTool({
241263 } ,
242264 parameters : z . object ( { url : z . string ( ) . url ( ) } ) ,
243265 execute : tool_fn ( 'scrape_as_markdown' , async ( { url} , ctx ) => {
244- let response = await axios ( {
266+ let response = await base_request ( {
245267 url : 'https://api.brightdata.com/request' ,
246268 method : 'POST' ,
247269 data : {
@@ -292,7 +314,7 @@ addTool({
292314 const url = search_url ( engine || 'google' , query , cursor ,
293315 geo_location ) ;
294316
295- return axios ( {
317+ return base_request ( {
296318 url : 'https://api.brightdata.com/request' ,
297319 method : 'POST' ,
298320 data : {
@@ -350,7 +372,7 @@ addTool({
350372 } ) ,
351373 execute : tool_fn ( 'scrape_batch' , async ( { urls} , ctx ) => {
352374 const scrapePromises = urls . map ( url =>
353- axios ( {
375+ base_request ( {
354376 url : 'https://api.brightdata.com/request' ,
355377 method : 'POST' ,
356378 data : {
0 commit comments