Skip to main content
Glama

test_rule

Test Autoconsent rules on specific URLs to verify consent management platform functionality in a real browser environment.

Instructions

Tests the given Autoconsent rule on the given URL

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesURL to navigate to
ruleYesAutoconsent rule (AutoConsentCMPRule)

Implementation Reference

  • The core handler function for the 'test_rule' tool. It sets up the page, injects the autoconsent script, navigates to the URL, handles messages from the content script, and returns test results including errors, CMP detection, popup findings, and opt-out results.
    export async function testRule(
      page: Page,
      url: string,
      rule: AutoConsentCMPRule,
      { viewportWidth = 1280, viewportHeight = 720 }: TestRuleSettings = {},
    ): Promise<TestRuleResults> {
      // Set viewport
      await page.setViewport({ width: viewportWidth, height: viewportHeight });
    
      // Reset browser data - clear cookies, cache, and storage
      await resetBrowserData(page);
    
      const messages: ContentScriptMessage[] = [];
    
      async function messageCallback(message: ContentScriptMessage) {
        messages.push(message);
    
        switch (message.type) {
          case "init": {
            await page.evaluate(
              `autoconsentReceiveMessage(${JSON.stringify({
                type: "initResp",
                rules: {
                  autoconsent: [rule],
                },
                config: {
                  enabled: true,
                  autoAction: "optOut",
                  disabledCmps: [],
                  enablePrehide: true,
                  detectRetries: 20,
                  enableCosmeticRules: true,
                },
              })})`,
            );
            break;
          }
          case "eval": {
            const result = await page.evaluate(message.code);
            await page.evaluate(
              `autoconsentReceiveMessage(${JSON.stringify({
                id: message.id,
                type: "evalResp",
                result: result,
              })})`,
            );
            break;
          }
        }
      }
    
      await page.exposeFunction("autoconsentSendMessage", messageCallback);
    
      await page.goto(url, {
        waitUntil: "domcontentloaded",
      });
    
      await injectAutoconsent(page);
      page.frames().forEach(injectAutoconsent);
      // page.on("framenavigated", injectAutoconsent);
    
      await new Promise((resolve) => setTimeout(resolve, 5000));
    
      const results = {
        errors: messages.filter((msg) => msg.type === "autoconsentError"),
        cmpDetectedMessage: messages.find((msg) => msg.type === "cmpDetected"),
        popupFoundMessage: messages.find((msg) => msg.type === "popupFound"),
        optOutResultMessage: messages.find((msg) => msg.type === "optOutResult"),
      };
    
      await page.removeExposedFunction("autoconsentSendMessage");
    
      return results;
    }
  • TypeScript type definitions for the input settings (TestRuleSettings) and output results (TestRuleResults) used by the testRule handler.
    type TestRuleSettings = {
      viewportWidth?: number;
      viewportHeight?: number;
    };
    
    type TestRuleResults = {
      errors: ErrorMessage[];
      cmpDetectedMessage?: DetectedMessage;
      popupFoundMessage?: FoundMessage;
      optOutResultMessage?: OptOutResultMessage;
    };
  • src/index.ts:128-142 (registration)
    Registration of the 'test_rule' tool in the TOOLS array, defining its name, description, and input schema for MCP tool listing.
    {
      name: "test_rule",
      description: "Tests the given Autoconsent rule on the given URL",
      inputSchema: {
        type: "object",
        properties: {
          url: { type: "string", description: "URL to navigate to" },
          rule: {
            type: "object",
            description: "Autoconsent rule (AutoConsentCMPRule)",
          },
        },
        required: ["url", "rule"],
      },
    },
  • MCP tool dispatcher case for 'test_rule' that calls the testRule function and formats the results into text output for the MCP response.
    case "test_rule":
      try {
        const rule = args.rule as AutoConsentCMPRule;
        const results = await testRule(page, args.url, rule);
    
        let output = `Test results for rule "${rule.name}" on ${args.url}:\n\n`;
    
        if (results.errors.length > 0) {
          output += `Errors:\n${results.errors.map((err) => JSON.stringify(err, null, 2)).join("\n")}\n\n`;
        }
    
        if (results.cmpDetectedMessage) {
          output += `CMP Detected: ${JSON.stringify(results.cmpDetectedMessage, null, 2)}\n\n`;
        }
    
        if (results.popupFoundMessage) {
          output += `Popup Found: ${JSON.stringify(results.popupFoundMessage, null, 2)}\n\n`;
        }
    
        if (results.optOutResultMessage) {
          output += `Opt-out Result: ${JSON.stringify(results.optOutResultMessage, null, 2)}\n\n`;
        }
    
        return {
          content: [
            {
              type: "text",
              text: output,
            },
          ],
          isError: false,
        };
      } catch (error) {
        return {
          content: [
            {
              type: "text",
              text: `Failed to test rule: ${(error as Error).message}`,
            },
          ],
          isError: true,
        };
      }
  • Helper function to inject the autoconsent Playwright script into the page or frame.
    async function injectAutoconsent(page: Page | Frame) {
      const autoconsentPath = path.resolve(
        __dirname,
        "../../node_modules/@duckduckgo/autoconsent/dist/autoconsent.playwright.js",
      );
      const autoconsentScript = fs.readFileSync(autoconsentPath, "utf8");
      await page.evaluate(autoconsentScript);
    }

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/noisysocks/autoconsent-mcp'

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