import { createErrorResponse, ToolResult } from '@/common/tool-handler'; import { BaseBrowserToolExecutor } from '../base-browser'; import { TOOL_NAMES } from 'chrome-mcp-shared'; import { TOOL_MESSAGE_TYPES } from '@/common/message-types'; const DEFAULT_NETWORK_REQUEST_TIMEOUT = 30000; // For sending a single request via content script interface NetworkRequestToolParams { url: string; // URL is always required method?: string; // Defaults to GET headers?: Record; // User-provided headers body?: any; // User-provided body timeout?: number; // Timeout for the network request itself } /** * NetworkRequestTool - Sends network requests based on provided parameters. */ class NetworkRequestTool extends BaseBrowserToolExecutor { name = TOOL_NAMES.BROWSER.NETWORK_REQUEST; async execute(args: NetworkRequestToolParams): Promise { const { url, method = 'GET', headers = {}, body, timeout = DEFAULT_NETWORK_REQUEST_TIMEOUT, } = args; console.log(`NetworkRequestTool: Executing with options:`, args); if (!url) { return createErrorResponse('URL parameter is required.'); } try { const tabs = await chrome.tabs.query({ active: true, currentWindow: true }); if (!tabs[0]?.id) { return createErrorResponse('No active tab found or tab has no ID.'); } const activeTabId = tabs[0].id; // Ensure content script is available in the target tab await this.injectContentScript(activeTabId, ['inject-scripts/network-helper.js']); console.log( `NetworkRequestTool: Sending to content script: URL=${url}, Method=${method}, Headers=${Object.keys(headers).join(',')}, BodyType=${typeof body}`, ); const resultFromContentScript = await this.sendMessageToTab(activeTabId, { action: TOOL_MESSAGE_TYPES.NETWORK_SEND_REQUEST, url: url, method: method, headers: headers, body: body, timeout: timeout, }); console.log(`NetworkRequestTool: Response from content script:`, resultFromContentScript); return { content: [ { type: 'text', text: JSON.stringify(resultFromContentScript), }, ], isError: !resultFromContentScript?.success, }; } catch (error: any) { console.error('NetworkRequestTool: Error sending network request:', error); return createErrorResponse( `Error sending network request: ${error.message || String(error)}`, ); } } } export const networkRequestTool = new NetworkRequestTool();