Skip to main content
Glama
mateogon

download-books-mcp

by mateogon
README.md
# download-books-mcp

Local MCP server and Codex skill for agent-driven book search and download through LibGen and Z-Library / Zeta Library.

This repo wraps two existing Python clients:

- [onurhanak/libgen-api-enhanced](https://github.com/onurhanak/libgen-api-enhanced) for LibGen / Library Genesis search and download metadata.
- [sertraline/zlibrary](https://github.com/sertraline/zlibrary) for Z-Library / Zeta Library search and authenticated downloads.

The purpose is to make those sources usable from MCP clients such as Codex, Claude Code, and other agents while keeping provider-specific details out of the agent-facing tool contract. The README is explicit for humans and GitHub search; the MCP tools and skill use neutral provider labels and clean IDs.

The MCP surface is intentionally small:

- `search_books(...)` returns clean candidates with a temporary `id`.
- `download_book(id=...)` downloads the selected candidate into a local library folder.

Internally, the server can query LibGen, Z-Library / Zeta Library, or both. Externally, provider internals stay behind neutral labels (`provider_1`, `provider_2`, `all`) so agents can use the MCP tools without handling provider-specific links, hashes, mirrors, URLs, or identifiers.

Use only sources, credentials, and documents you are authorized to access.

## Install

```bash
git clone https://github.com/mateogon/download-books-mcp.git
cd download-books-mcp
uv sync
```

Copy the environment example and fill local values:

```bash
cp .env.example .env
```

Important settings:

```bash
DOWNLOAD_BOOKS_PROVIDER=all
DOWNLOAD_BOOKS_LIBRARY_DIR=~/Downloads/books
BOOK_PROVIDER_2_EMAIL=
BOOK_PROVIDER_2_PASSWORD=
```

## Agent Installation

There are two pieces:

- **MCP server:** the runtime tools agents call.
- **Skill:** the workflow that tells Codex how to use those tools cleanly.

Add the MCP server to Codex by copying `examples/codex-config.toml` into `~/.codex/config.toml` and replacing `/absolute/path/to/download-books-mcp` with your clone path.

Install the Codex skill:

```bash
./scripts/install-codex-skill.sh
```

Restart Codex after changing MCP config or installing the skill.

For Hermes, use `examples/hermes-mcp.yaml`.

## MCP Tools

### `search_books`

Parameters:

```text
query: str
limit: int = 10
preferred_language: str = "English"
provider_name: str = "default"  # default | all | provider_1 | provider_2
search_type: str = "default"    # default | title | author
topic: str = "books"
preferred_author: str | None = None
```

Clean results include:

```text
id, title, author, year, language, extension, size, publisher, pages, score
```

Raw provider internals are cached locally for `download_book`, but they are not returned in normal MCP results.

### `download_book`

Parameters:

```text
id: str | int
library_dir: str | None = None
```

If `library_dir` is omitted, the server uses `DOWNLOAD_BOOKS_LIBRARY_DIR`.

Default output layout:

```text
<library_dir>/Sources/<Author - Title>/00 - Fuentes/<Title>.<extension>
```

## CLI

Search clean candidates:

```bash
uv run download-books search "The Embodied Mind" --search-type title --limit 10
```

Download a selected result:

```bash
uv run download-books download <ID>
```

Local diagnostic output:

```bash
uv run download-books search "The Embodied Mind" --raw --json
```

## Provider Routing

Visible provider options are:

- `default` uses `DOWNLOAD_BOOKS_PROVIDER`, defaulting to `all`
- `all` searches every available configured provider
- `provider_1` searches only the LibGen adapter
- `provider_2` searches only the Z-Library / Zeta Library adapter

Agents should normally leave provider routing at `default`.

The MCP and skill intentionally keep the neutral names. Humans reading this repo should understand the mapping; agents using the tool should not need to.

## Development

```bash
uv run --extra dev pytest
uv run python -m compileall src
```

TDQS

A4/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct purposes: one searches for books and returns metadata with IDs, the other downloads a specific book by ID. There is no overlap or ambiguity between them.

Naming Consistency5/5

Both tools follow a consistent verb_noun pattern: search_books and download_book. The slight singular/plural difference is natural and does not create inconsistency.

Tool Count4/5

With only 2 tools, the server is on the thin side, but given its narrow purpose of searching and downloading books, this count is appropriate and each tool clearly earns its place.

Completeness5/5

The server covers the essential workflow for its domain: discover books via search, then download via ID. This forms a complete user journey with no dead ends or obvious missing operations.

Maintenance

ActivityInactive
ResponsivenessNo issues