{
  "title": "IP allowlist merger",
  "human_url": "https://happytails.ai/en/network-tools/ip-allowlist-merger/",
  "agent_url": "https://happytails.ai/agents/en/network-tools/ip-allowlist-merger/",
  "language": "en",
  "markdown_url": "https://happytails.ai/en/network-tools/ip-allowlist-merger.md",
  "content": "IP allowlist merger\nCombine overlapping, duplicate and adjacent IPv4 and IPv6 ranges into the smallest exact CIDR list. No address outside your original entries is added.\nHow can we improve this tool?\nReport a problem or share an idea.\nPlease leave out private information. Your message and the tool name go to our team via PostHog.\nHow to use IP allowlist merger\nPaste addresses, CIDR blocks or start-end ranges, one per line.\nChoose whether CIDR entries with host bits set are rejected or changed to their network address.\nRun the merge and review the resulting CIDR blocks.\nCopy the list or download the text list, CSV or JSON report.\nUseful next steps\nIP allowlist overlap checker\nIP range exclusion tool\nIP range to CIDR\nSubnet calculator\nHow the merge works\nEach entry is read as an exact set of addresses. Overlapping, duplicate and touching ranges are joined, and each joined range is written as the fewest aligned CIDR blocks, following the CIDR rules in RFC 4632 (2006) and the IPv6 text format in RFC 5952 (2010). A self-check confirms the blocks cover exactly the same addresses as your input, so nothing is added or lost.\nWhat you can paste\nUse one entry per line, or separate entries with commas, semicolons or spaces. An entry can be an address such as 192.0.2.10, a CIDR block such as 192.0.2.0/24 or an inclusive range such as 192.0.2.10-192.0.2.20, and spaces around the hyphen are fine. Text after # is ignored, so you can keep comments. IPv4 parts must be 0 to 255 without leading zeros, because some systems read 010 as octal. Interface zones such as %eth0 and netmasks such as 255.255.255.0 are not accepted.\nHost bits and address families\nAn entry such as 192.0.2.10/24 has bits set after its prefix length. It is rejected by default, because it may be a typo for a single address. Choose Use the network address to treat it as 192.0.2.0/24; the JSON report lists every entry changed this way. IPv4 and IPv6 are handled separately, and IPv4-mapped IPv6 addresses such as ::ffff:192.0.2.1 stay in IPv6.\nReading the report\nThe JSON report gives every entry a status: kept, split, merged, duplicate or covered, and names the entry that covers it. Address counts are exact whole numbers. The before count adds the size of every entry, so overlapping addresses count more than once; the after count lists each address once and always equals the addresses your input already allowed.",
  "content_format": "text/plain",
  "visibility": "public",
  "links": [
    {
      "name": "IP allowlist overlap checker",
      "url": "https://happytails.ai/en/developer-tools/ip-allowlist-overlap-checker/"
    },
    {
      "name": "IP range exclusion tool",
      "url": "https://happytails.ai/en/network-tools/ip-range-exclusion-tool/"
    },
    {
      "name": "IP range to CIDR",
      "url": "https://happytails.ai/en/network-tools/ip-range-to-cidr/"
    },
    {
      "name": "Subnet calculator",
      "url": "https://happytails.ai/en/network-tools/subnet-calculator/"
    }
  ],
  "tool": {
    "id": "ip-allowlist-merger",
    "category": "network-tools",
    "built": true,
    "requirements": "Up to 100,000 characters and 1,000 entries per run, with at most 2,048 resulting CIDR blocks. Everything is calculated on your device and nothing is uploaded. Downloads: a plain text CIDR list, a CSV of blocks with first address, last address and address count, and a JSON report.",
    "implementation": {
      "fields": [
        {
          "key": "hostBits",
          "label": "Host bits in CIDR entries",
          "value": "reject",
          "type": "select",
          "values": [
            "reject",
            "normalize"
          ],
          "labels": {
            "reject": "Reject the entry",
            "normalize": "Use the network address"
          },
          "help": "An entry such as 192.0.2.10/24 has host bits set. Rejecting it is safest; normalizing uses 192.0.2.0/24 and lists the change in the report."
        }
      ],
      "registrationFamily": "ip-prefix-sets",
      "inputMaxLength": 100000,
      "inputErrorCode": "IP_PREFIX_SETS_TOO_LONG",
      "note": "Merging runs on your device for up to 100,000 characters and 1,000 entries, with at most 2,048 resulting CIDR blocks.",
      "experience": {
        "automatic": false,
        "single": false,
        "inputMaxLength": 100000,
        "inputMode": "text",
        "label": "Addresses, CIDR blocks or ranges",
        "placeholder": "10.20.0.0/24\n10.20.1.0/24\n192.0.2.10-192.0.2.20\n2001:db8:1200::/40",
        "help": "One entry per line, or separate entries with commas. Text after # is ignored. Up to 100,000 characters. Review the settings before running.",
        "action": null
      },
      "mode": "explicit",
      "interactive": false
    },
    "execution": "Browser interface",
    "api": null,
    "browser_agent": {
      "supported": true,
      "name": "run_current_tool",
      "discovery": "WebMCP on the human page in a supporting browser",
      "verification": "See audit/API-AUDIT.md; availability is not verification"
    }
  },
  "markdown": "# IP allowlist merger\n\n- Human page: https://happytails.ai/en/network-tools/ip-allowlist-merger/\n- Markdown: https://happytails.ai/en/network-tools/ip-allowlist-merger.md\n- Structured JSON: https://happytails.ai/agents/en/network-tools/ip-allowlist-merger/index.json\n- Visibility: public\n\n## Tool capabilities\n\n| Property | Value |\n| --- | --- |\n| Tool ID | `ip-allowlist-merger` |\n| Category | network-tools |\n| Implementation | Registered implementation. Registration alone is not a production-quality guarantee. |\n| Browser execution | Use the visible action or interactive controls. |\n| Browser processing | Browser; see tool notes for network behavior. |\n| HTTP API | Not callable through HTTP. |\n| Browser-agent interface | run_current_tool |\n\n### Implementation notes\n\nMerging runs on your device for up to 100,000 characters and 1,000 entries, with at most 2,048 resulting CIDR blocks.\n\n### Inputs and settings\n\nText input: Addresses, CIDR blocks or ranges.\n\nExample or placeholder shown in the interface (not a validated fixture):\n\n```text\n10.20.0.0/24\n10.20.1.0/24\n192.0.2.10-192.0.2.20\n2001:db8:1200::/40\n```\n\nOne entry per line, or separate entries with commas. Text after # is ignored. Up to 100,000 characters. Review the settings before running.\n\n| Setting | Meaning | Control type | Default | Constraints |\n| --- | --- | --- | --- | --- |\n| `hostBits` | Host bits in CIDR entries | select | \"reject\" | Allowed: reject, normalize |\n\n### Browser-agent workflow\n\n1. Open the human page in a browser that supports WebMCP.\n2. Discover the interface exposed by that page; use its actual schema.\n3. Select files on the page first when the tool requires files.\n4. Call `run_current_tool` with valid input and settings.\n5. Inspect the returned result or error and the displayed output. Retrieve files from the displayed download links.\n\nCalls do not automatically copy or download results. Browser permissions still apply. Interface availability alone is not proof of successful execution.\n\n### Planning specification\n\nUp to 100,000 characters and 1,000 entries per run, with at most 2,048 resulting CIDR blocks. Everything is calculated on your device and nothing is uploaded. Downloads: a plain text CIDR list, a CSV of blocks with first address, last address and address count, and a JSON report.\n\nThis describes intended requirements. Use the implementation notes, interface schema and observed output to determine current support.\n\n### Complete machine-readable capability record\n\n```json\n{\n  \"id\": \"ip-allowlist-merger\",\n  \"category\": \"network-tools\",\n  \"built\": true,\n  \"requirements\": \"Up to 100,000 characters and 1,000 entries per run, with at most 2,048 resulting CIDR blocks. Everything is calculated on your device and nothing is uploaded. Downloads: a plain text CIDR list, a CSV of blocks with first address, last address and address count, and a JSON report.\",\n  \"implementation\": {\n    \"fields\": [\n      {\n        \"key\": \"hostBits\",\n        \"label\": \"Host bits in CIDR entries\",\n        \"value\": \"reject\",\n        \"type\": \"select\",\n        \"values\": [\n          \"reject\",\n          \"normalize\"\n        ],\n        \"labels\": {\n          \"reject\": \"Reject the entry\",\n          \"normalize\": \"Use the network address\"\n        },\n        \"help\": \"An entry such as 192.0.2.10/24 has host bits set. Rejecting it is safest; normalizing uses 192.0.2.0/24 and lists the change in the report.\"\n      }\n    ],\n    \"registrationFamily\": \"ip-prefix-sets\",\n    \"inputMaxLength\": 100000,\n    \"inputErrorCode\": \"IP_PREFIX_SETS_TOO_LONG\",\n    \"note\": \"Merging runs on your device for up to 100,000 characters and 1,000 entries, with at most 2,048 resulting CIDR blocks.\",\n    \"experience\": {\n      \"automatic\": false,\n      \"single\": false,\n      \"inputMaxLength\": 100000,\n      \"inputMode\": \"text\",\n      \"label\": \"Addresses, CIDR blocks or ranges\",\n      \"placeholder\": \"10.20.0.0/24\\n10.20.1.0/24\\n192.0.2.10-192.0.2.20\\n2001:db8:1200::/40\",\n      \"help\": \"One entry per line, or separate entries with commas. Text after # is ignored. Up to 100,000 characters. Review the settings before running.\",\n      \"action\": null\n    },\n    \"mode\": \"explicit\",\n    \"interactive\": false\n  },\n  \"execution\": \"Browser interface\",\n  \"api\": null,\n  \"browser_agent\": {\n    \"supported\": true,\n    \"name\": \"run_current_tool\",\n    \"discovery\": \"WebMCP on the human page in a supporting browser\",\n    \"verification\": \"See audit/API-AUDIT.md; availability is not verification\"\n  }\n}\n```\n\n## Page guide\n\nCombine overlapping, duplicate and adjacent IPv4 and IPv6 ranges into the smallest exact CIDR list. No address outside your original entries is added.\n\nHow can we improve this tool?\n\nReport a problem or share an idea.\n\nPlease leave out private information. Your message and the tool name go to our team via PostHog.\n\n### How to use IP allowlist merger\n\n1. Paste addresses, CIDR blocks or start-end ranges, one per line.\n2. Choose whether CIDR entries with host bits set are rejected or changed to their network address.\n3. Run the merge and review the resulting CIDR blocks.\n4. Copy the list or download the text list, CSV or JSON report.\n\n## Useful next steps\n\n- [IP allowlist overlap checker](https://happytails.ai/en/developer-tools/ip-allowlist-overlap-checker/) ([Markdown](https://happytails.ai/en/developer-tools/ip-allowlist-overlap-checker.md))\n\n- [IP range exclusion tool](https://happytails.ai/en/network-tools/ip-range-exclusion-tool/) ([Markdown](https://happytails.ai/en/network-tools/ip-range-exclusion-tool.md))\n\n- [IP range to CIDR](https://happytails.ai/en/network-tools/ip-range-to-cidr/) ([Markdown](https://happytails.ai/en/network-tools/ip-range-to-cidr.md))\n\n- [Subnet calculator](https://happytails.ai/en/network-tools/subnet-calculator/) ([Markdown](https://happytails.ai/en/network-tools/subnet-calculator.md))\n\n## How the merge works\n\nEach entry is read as an exact set of addresses. Overlapping, duplicate and touching ranges are joined, and each joined range is written as the fewest aligned CIDR blocks, following the CIDR rules in RFC 4632 (2006) and the IPv6 text format in RFC 5952 (2010). A self-check confirms the blocks cover exactly the same addresses as your input, so nothing is added or lost.\n\n### What you can paste\n\nUse one entry per line, or separate entries with commas, semicolons or spaces. An entry can be an address such as 192.0.2.10, a CIDR block such as 192.0.2.0/24 or an inclusive range such as 192.0.2.10-192.0.2.20, and spaces around the hyphen are fine. Text after # is ignored, so you can keep comments. IPv4 parts must be 0 to 255 without leading zeros, because some systems read 010 as octal. Interface zones such as %eth0 and netmasks such as 255.255.255.0 are not accepted.\n\n### Host bits and address families\n\nAn entry such as 192.0.2.10/24 has bits set after its prefix length. It is rejected by default, because it may be a typo for a single address. Choose Use the network address to treat it as 192.0.2.0/24; the JSON report lists every entry changed this way. IPv4 and IPv6 are handled separately, and IPv4-mapped IPv6 addresses such as ::ffff:192.0.2.1 stay in IPv6.\n\n### Reading the report\n\nThe JSON report gives every entry a status: kept, split, merged, duplicate or covered, and names the entry that covers it. Address counts are exact whole numbers. The before count adds the size of every entry, so overlapping addresses count more than once; the after count lists each address once and always equals the addresses your input already allowed.\n"
}