Skip to main content
Glama

render.execute_js

Execute JavaScript code on webpages to analyze client-side behavior, test for vulnerabilities, and automate security assessments during bug bounty hunting.

Instructions

Execute JavaScript in the context of a webpage

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesURL to load
scriptYesJavaScript code to execute

Implementation Reference

  • The handler function for 'render.execute_js'. It creates a new browser page, navigates to the given URL, executes the provided JavaScript using page.evaluate with eval, and returns the result or error.
    async ({ url, script }: any): Promise<ToolResult> => {
      let page: Page | null = null;
      try {
        const browserInstance = await getBrowser();
        page = await browserInstance.newPage();
        
        await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
    
        const result = await page.evaluate((scriptToRun) => {
          try {
            return eval(scriptToRun);
          } catch (e) {
            return { error: e instanceof Error ? e.message : String(e) };
          }
        }, script);
    
        await page.close();
    
        return formatToolResult(true, {
          url,
          result,
        });
      } catch (error: any) {
        if (page) await page.close().catch(() => {});
        return formatToolResult(false, null, error.message);
      }
  • Input schema defining the parameters 'url' and 'script' for the 'render.execute_js' tool.
    inputSchema: {
      type: 'object',
      properties: {
        url: { type: 'string', description: 'URL to load' },
        script: { type: 'string', description: 'JavaScript code to execute' },
      },
      required: ['url', 'script'],
    },
  • Registration of the 'render.execute_js' tool using server.tool() within the registerRenderTools function.
    server.tool(
      'render.execute_js',
      {
        description: 'Execute JavaScript in the context of a webpage',
        inputSchema: {
          type: 'object',
          properties: {
            url: { type: 'string', description: 'URL to load' },
            script: { type: 'string', description: 'JavaScript code to execute' },
          },
          required: ['url', 'script'],
        },
      },
      async ({ url, script }: any): Promise<ToolResult> => {
        let page: Page | null = null;
        try {
          const browserInstance = await getBrowser();
          page = await browserInstance.newPage();
          
          await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
    
          const result = await page.evaluate((scriptToRun) => {
            try {
              return eval(scriptToRun);
            } catch (e) {
              return { error: e instanceof Error ? e.message : String(e) };
            }
          }, script);
    
          await page.close();
    
          return formatToolResult(true, {
            url,
            result,
          });
        } catch (error: any) {
          if (page) await page.close().catch(() => {});
          return formatToolResult(false, null, error.message);
        }
      }
    );
  • src/index.ts:42-42 (registration)
    Top-level call to registerRenderTools(server), which includes registration of 'render.execute_js'.
    registerRenderTools(server);
  • Helper function getBrowser() that provides a shared Puppeteer browser instance, used by the tool handler.
    async function getBrowser(): Promise<Browser> {
      if (!browser) {
        browser = await puppeteer.launch({
          headless: true,
          args: ['--no-sandbox', '--disable-setuid-sandbox'],
        });
      }
      return browser;
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/telmon95/VulneraMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server