{"name":"io.github.mgcrea/mcp-apple-safari","slug":"mgcrea-mcp-apple-safari","title":"Apple Safari","description":"Read and act on Safari — history, tabs and reading list, writes off by default","url":"https://mcp.market/server/mgcrea-mcp-apple-safari","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":37,"stars":3,"forks":0,"downloads_week":428,"last_push_at":"2026-09-19T09:15:42.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/mgcrea/cupertino","website":"https://cupertino.mgcrea.io","version":"1.23.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@mgcrea/mcp-apple-safari","version":"1.23.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Register the mutating tools. Off by default, and the gate decides whether the write tools exist at all rather than merely refusing — an agent with writes off cannot see them.","name":"APPLE_SAFARI_ALLOW_WRITES"}]}],"tools":[{"name":"apple_safari_add_reading_list_item","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_click","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_diagnostics","description":"Report which of Safari's two lanes are working, what each one can answer, and what this server deliberately cannot do. Start here when a read returns nothing — on this surface one lane failing while the other works is normal.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_fill","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_find_codes","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_get_page","description":"Get one page from browsing history by its ref, with visit counts and first/last visit times. Needs Full Disk Access.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_list_bookmarks","description":"List Safari bookmarks, with the folder each one sits in. Needs Full Disk Access. Reads the bookmarks file directly and does NOT require Safari to be running. Reading List entries are excluded — use apple_safari_list_reading_list for those.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_list_reading_list","description":"List Safari's Reading List — pages saved to read later. Needs Full Disk Access; does NOT require Safari to be running. Unread state is derived from whether the entry has ever been opened: there is no read/unread flag in Safari's data, only the presence or absence of a last-viewed date. Entries may carry a short preview of the page text.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_list_tabs","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_open_url","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_page_elements","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_read_page","description":"Read the content of a page open in Safari, as readable text or raw HTML. Needs the Cupertino Safari extension installed, enabled, and ALLOWED ON THAT WEBSITE — Safari grants extensions per site, so a page you have not permitted returns nothing even though the extension is on. This is NOT a live read: the extension captures a page when it loads, so what comes back is that snapshot. Check `ageSecond","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_scroll","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"apple_safari_search_history","description":"Search Safari browsing history by URL or page title, optionally within a date range. Needs Full Disk Access — there is no second lane for history, so without the grant this returns an error rather than an empty list. Results are pages (one per URL), newest visit first, each with a visit count and a ref for apple_safari_get_page.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-19T19:31:29.637Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:31:29.726Z","components":{"code":{"score":25,"max":25,"notes":["6 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@mgcrea/mcp-apple-safari","version":"1.23.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-19T09:28:34.057Z","repositoryUrl":"git+https://github.com/mgcrea/cupertino.git","weeklyDownloads":428}],"repo":{"found":true,"owner":"mgcrea","repo":"cupertino","archived":false,"pushedAt":"2026-09-19T09:15:42Z","stars":3,"forks":0,"openIssues":2,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/108273?v=4","ownerCreatedAt":"2009-07-24T09:50:40Z","license":"MIT"},"icon":{"url":"https://cupertino.mgcrea.io/apple-touch-icon.png","source":"registry","width":180,"height":180},"presence":{"stars":3,"forks":0,"downloadsWeek":428,"license":"MIT","lastPushAt":"2026-09-19T09:15:42.000Z","score":37}}}},"grade_history":[],"reviews":[]}