# Safari Bookmarks To Html — REST API endpoint `safari-bookmarks-to-html`

Convert Safari's Bookmarks.plist (from ~/Library/Safari on a Mac or a backup of it) into a Netscape bookmarks.html that Chrome, Firefox, Edge and other browsers import. Reads the binary bplist00 file Safari writes, sent as base64 with input_encoding "base64", or an XML plist from plutil -convert xml1 as text. The WebBookmarkTypeList folders and WebBookmarkTypeLeaf bookmarks (URLString and URIDictionary.title) are walked in order: the BookmarksBar root becomes a "Favorites" folder marked as the toolbar folder, BookmarksMenu becomes "Bookmarks Menu", and the Reading List (com.apple.ReadingList) becomes a "Reading List" folder with each item's date added, unless include_reading_list is false. The History proxy entry is skipped, empty folders are left out unless include_empty_folders is true, and sync metadata, icons and Reading List preview text are not carried over. A plist that is not Safari's bookmarks file (an Info.plist, a .webloc) is refused with what it looks like. Nothing is fetched.

- Category: text
- MCP server: https://mcp.findutils.com/ (Streamable HTTP, API key for tools/call, 120 req/min per IP)
- REST endpoint: POST https://api.findutils.com/api/tools/safari-bookmarks-to-html/execute (API key, 60 req/min per IP)
- API key: Running a tool needs an API key. Keys are not for sale yet: ask for early access. Without a key, a tool call answers HTTP 402 Payment Required with the error code PAYMENT_REQUIRED. The catalog and the schemas stay open without a key. https://findutils.com/api/#api-keys
- Reference page: https://findutils.com/api/safari-bookmarks-to-html/
- Same tool on the other surface: https://findutils.com/mcp/safari-bookmarks-to-html/

## Call the endpoint (verified example)

```bash
curl -X POST https://api.findutils.com/api/tools/safari-bookmarks-to-html/execute \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n\t<key>Children</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Children</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>URIDictionary</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>title</key>\n\t\t\t\t\t\t<string>Example</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>URLString</key>\n\t\t\t\t\t<string>https://example.com/</string>\n\t\t\t\t\t<key>WebBookmarkType</key>\n\t\t\t\t\t<string>WebBookmarkTypeLeaf</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Title</key>\n\t\t\t<string>BookmarksBar</string>\n\t\t\t<key>WebBookmarkType</key>\n\t\t\t<string>WebBookmarkTypeList</string>\n\t\t</dict>\n\t</array>\n\t<key>WebBookmarkType</key>\n\t<string>WebBookmarkTypeList</string>\n</dict>\n</plist>\n"
  }'

# Parameter schema (no key needed)
curl https://api.findutils.com/api/tools/safari-bookmarks-to-html
```

## Input schema

| Argument | Type | Required | Description |
|---|---|---|---|
| `input` | string | yes | The Bookmarks.plist file: base64 of the file bytes (input_encoding "base64", needed for the binary form), or XML plist text. |
| `input_encoding` | string (text \| base64) | no | "text" (default) for an XML plist, or "base64" for the file bytes, binary or XML. Default: `"text"`. |
| `include_reading_list` | boolean | no | Write the Reading List as its own "Reading List" folder. Default true; false leaves those items out and counts them. Default: `true`. |
| `include_empty_folders` | boolean | no | Also write folders that hold no bookmark. Default false: they are left out and counted. Default: `false`. |

Example arguments (verified):

```json
{
  "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n\t<key>Children</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Children</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>URIDictionary</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>title</key>\n\t\t\t\t\t\t<string>Example</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>URLString</key>\n\t\t\t\t\t<string>https://example.com/</string>\n\t\t\t\t\t<key>WebBookmarkType</key>\n\t\t\t\t\t<string>WebBookmarkTypeLeaf</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>Title</key>\n\t\t\t<string>BookmarksBar</string>\n\t\t\t<key>WebBookmarkType</key>\n\t\t\t<string>WebBookmarkTypeList</string>\n\t\t</dict>\n\t</array>\n\t<key>WebBookmarkType</key>\n\t<string>WebBookmarkTypeList</string>\n</dict>\n</plist>\n"
}
```

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/ --header "Authorization: Bearer YOUR_API_KEY"
```

Then ask the client to call `findutils:safari_bookmarks_to_html`. Full MCP reference: https://findutils.com/mcp/safari-bookmarks-to-html/

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