safari-reading-list-mcp
Allows exporting Safari Reading List entries to JSON, with support for filtering by time range (default week, custom range) and adding new items.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@safari-reading-list-mcpshow me my reading list entries for today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
safari-reading-list-mcp
An Anthropic MCP server project for Apple Safari Reading List workflows on macOS.
This repository now provides a working MCP server and CLI for exporting Safari Reading List data to JSON.
Project Status
Feature 001 is complete: export Safari Reading List entries (all, default week, custom range).
MCP server entrypoint is active via
main.pyandsafari_reading_list_mcp/server.py.CLI entrypoint
srlis available with export and serve commands.Quality checks are automated with mise tasks for lint, type checks, and tests.
Related MCP server: safari-bookmarks-mcp
Goals
Expose MCP tools/resources to read and export Safari Reading List items.
Support adding new items to Safari Reading List.
Keep implementation and decisions documented for durable project memory.
Requirements
macOS (Safari Reading List target platform)
Python 3.14
uvOptional:
misefor tool version management
Quick Start
Install dependencies:
uv sync
Run MCP server (stdio transport):
uv run python main.py
Use CLI:
srl --help
Run all checks:
mise run test:all
Repository Layout
main.py- runtime entrypoint that starts the MCP serversafari_reading_list_mcp/- implementation modules (server, service, adapter, time/filter/export helpers, CLI)pyproject.toml- project metadata and dependenciesmise.toml- local tool/runtime configuration.mise/tasks/- reusable project tasks (lint, types, unit, coverage)AGENTS.md- primary agent/human collaboration conventionsdocs/- project memory (plans, features, design, decisions, guides).github/prompts/- reusable workflow prompts for agent sessions
Development Workflow
Use the documentation cycle:
define behavior in
docs/features/create execution plans in
docs/plans/capture hard-to-reverse decisions in
docs/decisions/maintain architecture rationale in
docs/design/keep practical usage notes in
docs/guides/
For agent/human operating conventions, start with AGENTS.md.
Available Tools
3 toolsexport_reading_listA
Export Safari Reading List entries to a JSON file. Defaults to the last 7 days unless full_export is true or a custom range is provided.
| Name | Required | Description | Default |
|---|---|---|---|
| output_path | Yes | ||
| start_time | No | ||
| end_time | No | ||
| full_export | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| output_path | Yes | |
| exported_count | Yes | |
| total_count | Yes | |
| filters_applied | Yes | |
| warnings | Yes | |
| error | Yes | |
| new_to_db | Yes | |
| already_added | Yes | |
| already_skipped | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Only mentions output file format, but does not disclose behavioral traits like overwriting behavior, directory creation, permissions needed, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundancy. First sentence states primary action, second sentence clarifies time range defaults and options.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters and no annotations, the description covers time range logic but lacks details on output path, side effects, or return value (output schema exists but not leveraged). Adequate but with gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but description adds meaning for time range defaults and full_export option. However, output_path parameter is left unexplained (format, permissions). Partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Export Safari Reading List entries to a JSON file.' Immediately states output format and distinguishes from sibling tools which manage state or mark items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context on default time range (last 7 days) and options (full_export or custom range), but lacks explicit guidance on when to use this tool vs alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reading_list_stateB
List Reading List articles by processing state. status: 'pending' (default), 'added', or 'skipped'.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| state_db_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states that the tool lists articles by state, without revealing any traits like idempotency, safety, side effects, or response format. Minimal transparency beyond the operation itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one sentence with an additional clarification on the status parameter. It front-loads the action and resource, with no superfluous words. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema, return value details are covered. The description explains the status parameter but not the state_db_path parameter, which is a significant omission for a simple two-parameter tool. It is partially complete but lacks full parameter context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It adds meaning to the 'status' parameter by listing the expected values and default. However, it does not mention the 'state_db_path' parameter at all, leaving a gap for half the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'Reading List articles', and specifies the filtering by processing state. It distinguishes from sibling tools 'export_reading_list' and 'mark_reading_list_item' which have different purposes. However, it does not explicitly state that it is read-only, which would add clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description implies usage for listing articles by status but does not provide context on prerequisites, default behavior, or when to choose another tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_reading_list_itemC
Mark a Reading List URL as 'added' (incorporated into Second Brain) or 'skipped'.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| status | Yes | ||
| state_db_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden of behavioral disclosure. It only states the basic mutation action but does not explain idempotency, overwrite behavior, authentication requirements, or any side effects. The output schema is present but not described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. However, it is too brief to fully serve the tool's purpose and could benefit from additional structured details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters (including an optional one), no annotation support, and an output schema, the description is insufficient. It lacks context on parameter syntax, output structure, and operational behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should compensate but only hints at 'url' and 'status'. The optional parameter 'state_db_path' is entirely unexplained. The status values are implied ('added'/'skipped') but not formally documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (mark) and resource (Reading List URL) with specific statuses ('added' or 'skipped'). However, it does not differentiate from sibling tools export_reading_list and list_reading_list_state, relying on the user to infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, exclusions, or appropriate contexts for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v0.2.0- First observed
export_reading_list - First observed
list_reading_list_state - First observed
mark_reading_list_item
TDQS
Each tool has a clearly distinct purpose: exporting to file, listing by state, and marking an item. No overlap in functionality.
All tools follow a consistent verb_noun pattern (export_reading_list, list_reading_list_state, mark_reading_list_item) using snake_case.
Three tools is well-scoped for a focused server that handles exporting, listing by state, and marking items in Safari Reading List.
The set covers essential operations for processing reading list items (export, list by state, mark status), but lacks a tool to add or delete entries, which might be desired for full lifecycle management.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search, label, and manage your X (Twitter) bookmarks from any MCP client via Tweetsmash
Save, search and organize bookmarks, highlights, feeds and knowledge cards in a Linkflare library.
Search and save to your Purl read-it-later knowledge base from any MCP client.
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
Related MCP Servers
FlicenseNot gradedqualityBmaintenanceEnables interaction with a read-later and link sharing social feed app, allowing users to manage links, bookmarks, and share through web, API, and MCP.85-- AlicenseNot gradedqualityBmaintenanceManage Safari bookmarks through an MCP server, providing tools to list, search, add, remove, and organize bookmarks and folders.Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables reading, sending, and managing iMessage conversations on macOS through MCP.1MIT
- AlicenseBqualityCmaintenanceEnables management of Raindrop.io bookmarks, collections, tags, and highlights via MCP tools, with support for search, bulk editing, and library auditing.17MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mcallaway/safari-reading-list-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server