Skip to main content
Glama
mcallaway

safari-reading-list-mcp

by mcallaway

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.py and safari_reading_list_mcp/server.py.

  • CLI entrypoint srl is 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

  • uv

  • Optional: mise for tool version management

Quick Start

  1. Install dependencies:

    • uv sync

  2. Run MCP server (stdio transport):

    • uv run python main.py

  3. Use CLI:

    • srl --help

  4. Run all checks:

    • mise run test:all

Repository Layout

  • main.py - runtime entrypoint that starts the MCP server

  • safari_reading_list_mcp/ - implementation modules (server, service, adapter, time/filter/export helpers, CLI)

  • pyproject.toml - project metadata and dependencies

  • mise.toml - local tool/runtime configuration

  • .mise/tasks/ - reusable project tasks (lint, types, unit, coverage)

  • AGENTS.md - primary agent/human collaboration conventions

  • docs/ - 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 tools
export_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
output_pathYes
start_timeNo
end_timeNo
full_exportNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
successYes
output_pathYes
exported_countYes
total_countYes
filters_appliedYes
warningsYes
errorYes
new_to_dbYes
already_addedYes
already_skippedYes

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNo
state_db_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
statusYes
state_db_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 3 tool updatesv0.2.0
    • First observedexport_reading_list
    • First observedlist_reading_list_state
    • First observedmark_reading_list_item

TDQS

A3.5/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: exporting to file, listing by state, and marking an item. No overlap in functionality.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (export_reading_list, list_reading_list_state, mark_reading_list_item) using snake_case.

Tool Count5/5

Three tools is well-scoped for a focused server that handles exporting, listing by state, and marking items in Safari Reading List.

Completeness4/5

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

ActivityInactive
ResponsivenessSyncing

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables reading, sending, and managing iMessage conversations on macOS through MCP.
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables management of Raindrop.io bookmarks, collections, tags, and highlights via MCP tools, with support for search, bulk editing, and library auditing.
    17
    MIT

Latest Blog Posts

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