# Merge Bookmarks — REST API endpoint `merge-bookmarks`

Merge two or more Netscape bookmarks.html exports (Chrome, Firefox, Edge, Safari) into one bookmarks.html that any browser imports. Every link and folder is kept in file order; by default each file goes under its own top-level folder named after the file, and wrap_in_folders=false merges folders that share a name (both "Bookmarks bar" folders become one). dedupe keeps the first copy of each address, compared the way dedupe_bookmarks compares them: host case, default port and trailing slash folded, and by default utm_* / fbclid / gclid parameters and the #fragment ignored. An input with no bookmarks is reported and the rest still merge. Descriptions, icons and tags are not carried over, empty folders are not written, and no link is fetched.

- Category: text
- MCP server: https://mcp.findutils.com/ (Streamable HTTP, no API keys, 120 req/min per IP)
- REST endpoint: POST https://api.findutils.com/api/tools/merge-bookmarks/execute (no API keys, 60 req/min per IP)
- Reference page: https://findutils.com/api/merge-bookmarks/
- Same tool on the other surface: https://findutils.com/mcp/merge-bookmarks/

## Call the endpoint (verified example)

```bash
curl -X POST https://api.findutils.com/api/tools/merge-bookmarks/execute \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": [
      "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<DL><p>\n    <DT><A HREF=\"https://example.com/\">Example</A>\n</DL><p>\n",
      "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<DL><p>\n    <DT><A HREF=\"https://example.org/\">Example Org</A>\n</DL><p>\n"
    ],
    "names": [
      "work.html",
      "home.html"
    ]
  }'

# Parameter schema
curl https://api.findutils.com/api/tools/merge-bookmarks
```

## Input schema

| Argument | Type | Required | Description |
|---|---|---|---|
| `inputs` | array | yes | The bookmarks.html file contents, one string per file, in the order they should appear. At least 2 with bookmarks, at most 20. |
| `names` | array | no | Optional file names, one per input, used to name each file's folder (the .html extension is dropped). Missing names become "File 1", "File 2"… |
| `wrap_in_folders` | boolean | no | Put each file under a top-level folder named after it. Default true. When false, folders with the same name at the same level are merged. Default: `true`. |
| `dedupe` | boolean | no | Keep only the first copy of each address. Default false: every copy stays. Default: `false`. |
| `strip_tracking` | boolean | no | When deduping, treat utm_*, fbclid and gclid parameters as noise. Default true. Default: `true`. |
| `ignore_fragment` | boolean | no | When deduping, treat addresses that differ only by #fragment as the same page. Default true. Default: `true`. |

Example arguments (verified):

```json
{
  "inputs": [
    "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<DL><p>\n    <DT><A HREF=\"https://example.com/\">Example</A>\n</DL><p>\n",
    "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<DL><p>\n    <DT><A HREF=\"https://example.org/\">Example Org</A>\n</DL><p>\n"
  ],
  "names": [
    "work.html",
    "home.html"
  ]
}
```

OpenAPI 3.1 spec: https://findutils.com/api/openapi.json · Interactive docs: https://findutils.com/api/docs/

## Also an MCP tool

```bash
claude mcp add findutils --transport http https://mcp.findutils.com/
```

Then ask the client to call `findutils:merge_bookmarks`. Full MCP reference: https://findutils.com/mcp/merge-bookmarks/

---
Full catalog: GET https://api.findutils.com/api/tools · https://findutils.com/api/ · https://findutils.com/llms.txt
