Skip to content

Safari Bookmarks To Html MCP tool

MCP findutils: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.

Needs an API key. Running a tool needs an API key. Keys are not for sale yet: ask for early access. About API keys

Arguments

application/json
  • input

    string required

    The Bookmarks.plist file: base64 of the file bytes (input_encoding "base64", needed for the binary form), or XML plist text.

  • input_encoding

    string optional

    "text" (default) for an XML plist, or "base64" for the file bytes, binary or XML. One of text · base64. Default "text".

  • include_reading_list

    boolean optional

    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 optional

    Also write folders that hold no bookmark. Default false: they are left out and counted. Default false.

Example arguments

Verified
{
  "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"
}