EPUB/PDF tools: merge, split, compress, convert, edit metadata, validate ebooks.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Compress an EPUB file to reduce its size. Can optionally strip unused assets (images, fonts not referenced by any chapter). Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
Base64-encoded EPUB file content
Original filename — the output is named after its stem (e.g. "Book.epub" gives "Book (compressed).epub"); without it the output keeps a fixed name
Compression level (1=fastest, 9=smallest)
Remove assets not referenced by any chapter
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Compress an EPUB file to reduce its size. Can optionally strip unused assets (images, fonts not referenced by any chapter). Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded EPUB file content |
| name | string | Original filename — the output is named after its stem (e.g. "Book.epub" gives "Book (compressed).epub"); without it the output keeps a fixed name |
| level | integer | Compression level (1=fastest, 9=smallest) |
| stripUnused | boolean | Remove assets not referenced by any chapter |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded EPUB file content"
},
"name": {
"type": "string",
"description": "Original filename — the output is named after its stem (e.g. \"Book.epub\" gives \"Book (compressed).epub\"); without it the output keeps a fixed name"
},
"level": {
"type": "integer",
"default": 6,
"maximum": 9,
"minimum": 1,
"description": "Compression level (1=fastest, 9=smallest)"
},
"stripUnused": {
"type": "boolean",
"default": false,
"description": "Remove assets not referenced by any chapter"
}
}
}Convert a Word document (.docx) to a valid EPUB3 ebook. Chapters split on the document's top heading level (Heading 1 in a normal manuscript), or on page breaks, or not at all. Keeps bold/italic, lists, tables, inline images (PNG/JPEG/GIF/WebP), hyperlinks and footnotes; reads the title and author from the document's properties. No Pandoc, no Calibre. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded .docx file content |
| name | string | Original filename — used as the title fallback; the output is named after its stem |
| title | string | Book title (defaults to the document title, then its first heading) |
| author | string | Author (defaults to the document author) |
| language | string | dc:language of the generated EPUB (BCP 47) |
| chapterMode | string | Where chapters start |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded .docx file content"
},
"name": {
"type": "string",
"description": "Original filename — used as the title fallback; the output is named after its stem"
},
"title": {
"type": "string",
"maxLength": 300,
"description": "Book title (defaults to the document title, then its first heading)"
},
"author": {
"type": "string",
"maxLength": 300,
"description": "Author (defaults to the document author)"
},
"language": {
"type": "string",
"default": "en",
"description": "dc:language of the generated EPUB (BCP 47)"
},
"chapterMode": {
"enum": [
"headings",
"page-breaks",
"single"
],
"type": "string",
"default": "headings",
"description": "Where chapters start"
}
}
}Edit metadata fields in an EPUB file (title, author, language, publisher, description, series, cover image, etc.). Returns the modified EPUB. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| date | string | |
| file* | string | Base64-encoded EPUB file content |
| isbn | string | |
| name | string | Original filename — the output is named after its stem (e.g. "Book.epub" gives "Book (compressed).epub"); without it the output keeps a fixed name |
| cover | string | Base64-encoded cover image (JPEG or PNG, max 5MB) |
| title | string | |
| author | string | |
| series | string | |
| authors | string |
Convert an EPUB ebook to Markdown. Returns a ZIP with one Markdown file per chapter (YAML frontmatter with title/book/author/chapter), an index.md with book metadata and a linked table of contents, and the referenced images. Plain CommonMark — drops straight into an Obsidian vault or any notes pipeline. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded EPUB file content |
| name | string | Original filename — the output is named after its stem (e.g. "Book.epub" gives "Book (compressed).epub"); without it the output keeps a fixed name |
| includeImages | boolean | Copy referenced images into an images/ folder |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded EPUB file content"
},
"name": {
"type": "string",
"description": "Original filename — the output is named after its stem (e.g. \"Book.epub\" gives \"Book (compressed).epub\"); without it the output keeps a fixed name"
},
"includeImages": {
"type": "boolean",
"default": true,
"description": "Copy referenced images into an images/ folder"
}
}
}Convert an EPUB ebook to PDF. Supports page size, margins, font, and page number options. Pro ($9/mo) is strongly recommended for PDF conversion — the 30MB limit handles illustrated or academic books that exceed the free 5MB cap. Upgrade at https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded EPUB file content |
| name | string | Original filename — the output is named after its stem (e.g. "Book.epub" gives "Book (compressed).epub"); without it the output keeps a fixed name |
| margins | integer | Page margins in points |
| fontSize | integer | Font size in points |
| pageSize | string | |
| fontFamily | string | |
| pageNumbers | boolean |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded EPUB file content"
},
"name": {
"type": "string",
"description": "Original filename — the output is named after its stem (e.g. \"Book.epub\" gives \"Book (compressed).epub\"); without it the output keeps a fixed name"
},
"margins": {
"type": "integer",
"default": 60,
"description": "Page margins in points"
},
"fontSize": {
"type": "integer",
"default": 11,
"maximum": 48,
"minimum": 6,
"description": "Font size in points"
},
"pageSize": {
"enum": [
"a4",
"letter"
],
"type": "string",
"default": "a4"
},
"fontFamily": {
"enum": [
"serif",
"sans"
],
"type": "string",
"default": "serif"
},
"pageNumbers": {
"type": "boolean",
"default": true
}
}
}Generate an AI book cover image using FLUX. Describe your vision, pick a genre, and get a portrait JPEG cover — 768×1152 when the model honours the requested size, otherwise its default square. The AI enhances your prompt with professional composition guidance while preserving your creative vision. Pro only ($9/mo). Upgrade at https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| seed | integer | Random seed for reproducible generation |
| genre | string | Book genre — affects style and composition |
| title | string | Book title — used to synthesize a cover concept when no description is given (not rendered on cover) |
| author | string | Author name (for context, not rendered on cover) |
| description | string | Creative description of the desired book cover (max 2000 chars). Either description or title is required. |
{
"type": "object",
"required": [],
"properties": {
"seed": {
"type": "integer",
"description": "Random seed for reproducible generation"
},
"genre": {
"enum": [
"fantasy",
"romance",
"thriller",
"sci-fi",
"literary",
"non-fiction",
"horror",
"children",
"poetry",
"minimalist"
],
"type": "string",
"description": "Book genre — affects style and composition"
},
"title": {
"type": "string",
"maxLength": 200,
"description": "Book title — used to synthesize a cover concept when no description is given (not rendered on cover)"
},
"author": {
"type": "string",
"maxLength": 200,
"description": "Author name (for context, not rendered on cover)"
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Creative description of the desired book cover (max 2000 chars). Either description or title is required."
}
}
}Build a valid EPUB3 ebook from Markdown files — one file per chapter, in array order. Understands YAML frontmatter (title/author) and Obsidian [[wikilinks]]; cross-file .md links are rewritten to chapter links inside the book. No Pandoc required. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| files* | array | Markdown files, one per chapter, in reading order |
| title | string | Book title (defaults to frontmatter or first heading) |
| author | string | Author (defaults to frontmatter) |
| language | string |
{
"type": "object",
"required": [
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"content"
],
"properties": {
"name": {
"type": "string",
"description": "Filename (used for chapter title fallback and cross-file link rewrites; the first one names the output)"
},
"content": {
"type": "string",
"description": "Base64-encoded Markdown content"
}
}
},
"minItems": 1,
"description": "Markdown files, one per chapter, in reading order"
},
"title": {
"type": "string",
"maxLength": 300,
"description": "Book title (defaults to frontmatter or first heading)"
},
"author": {
"type": "string",
"maxLength": 300,
"description": "Author (defaults to frontmatter)"
},
"language": {
"type": "string",
"default": "en"
}
}
}Merge multiple EPUB files into a single ebook with table of contents and chapter dividers. Accepts 2+ base64-encoded EPUB files. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| files* | array | Array of base64-encoded EPUB files to merge (order preserved) |
| names | array | Original filenames, in the same order as files — the output is named after them ("A + B.epub", or "A + N more.epub" past two); without them it is merged.epub |
| title | string | Title for the merged EPUB (optional) |
| author | string | Author for the merged EPUB (optional) |
| dividers | boolean | Insert divider pages between books |
{
"type": "object",
"required": [
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "string",
"description": "Base64-encoded EPUB file content"
},
"minItems": 2,
"description": "Array of base64-encoded EPUB files to merge (order preserved)"
},
"names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Original filenames, in the same order as files — the output is named after them (\"A + B.epub\", or \"A + N more.epub\" past two); without them it is merged.epub"
},
"title": {
"type": "string",
"maxLength": 300,
"description": "Title for the merged EPUB (optional)"
},
"author": {
"type": "string",
"maxLength": 300,
"description": "Author for the merged EPUB (optional)"
},
"dividers": {
"type": "boolean",
"default": true,
"description": "Insert divider pages between books"
}
}
}Convert a PDF document to EPUB ebook format. Supports automatic chapter detection, image extraction (Pro), and custom chapter grouping. Free tier supports up to 10MB per PDF. Pro ($9/mo) is strongly recommended for PDF conversion — the 30MB limit handles most scanned or illustrated PDFs. Upgrade at https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded PDF file content |
| name | string | Original filename — the output is named after its stem (e.g. "Book.epub" gives "Book (compressed).epub"); without it the output keeps a fixed name |
| language | string | Language code for the output EPUB |
| chapterMode | string | How to split into chapters |
| extractImages | boolean | Pro only — ignored on free tier |
| pagesPerChapter | integer | Pages per chapter (only for every-n mode) |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded PDF file content"
},
"name": {
"type": "string",
"description": "Original filename — the output is named after its stem (e.g. \"Book.epub\" gives \"Book (compressed).epub\"); without it the output keeps a fixed name"
},
"language": {
"type": "string",
"default": "en",
"description": "Language code for the output EPUB"
},
"chapterMode": {
"enum": [
"auto",
"every-n",
"single"
],
"type": "string",
"default": "auto",
"description": "How to split into chapters"
},
"extractImages": {
"type": "boolean",
"default": true,
"description": "Pro only — ignored on free tier"
},
"pagesPerChapter": {
"type": "integer",
"default": 10,
"description": "Pages per chapter (only for every-n mode)"
}
}
}Read metadata from an EPUB file (title, author, language, publisher, description, series, cover status, etc.). Returns JSON — no file output. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded EPUB file content |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded EPUB file content"
}
}
}Split an EPUB. With a chapter range (chapterStart and/or chapterEnd) the result is ONE base64-encoded EPUB of exactly those chapters, in order, with the book's metadata, a table of contents limited to them and the fonts and images they use. Without a range the result is a base64-encoded ZIP archive holding one EPUB per chapter. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded EPUB file content |
| name | string | Original filename — the output is named after its stem (e.g. "Book.epub" gives "Book (compressed).epub"); without it the output keeps a fixed name |
| chapterEnd | integer | Last chapter to include (inclusive, optional) |
| chapterStart | integer | First chapter to include (1-indexed, optional). Giving either bound returns one EPUB of the range instead of a ZIP |
| keepMetadata | boolean | Preserve the original author, publisher and description in the output |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded EPUB file content"
},
"name": {
"type": "string",
"description": "Original filename — the output is named after its stem (e.g. \"Book.epub\" gives \"Book (compressed).epub\"); without it the output keeps a fixed name"
},
"chapterEnd": {
"type": "integer",
"minimum": 1,
"description": "Last chapter to include (inclusive, optional)"
},
"chapterStart": {
"type": "integer",
"minimum": 1,
"description": "First chapter to include (1-indexed, optional). Giving either bound returns one EPUB of the range instead of a ZIP"
},
"keepMetadata": {
"type": "boolean",
"default": true,
"description": "Preserve the original author, publisher and description in the output"
}
}
}Get a checkout link so the user can upgrade THIS account to Epublys Pro. Call this when another tool is refused with `daily_limited` or a Pro-only error, or when the user asks to upgrade. Returns a Stripe checkout URL to hand to the user — they complete payment in their own browser. Creates no charge by itself, and the link is bound to the account that owns the API key being used, so it cannot be used to pay for anyone else. If the account is already Pro it says so and returns no link. Needs an API key: without one it returns the pricing URL instead of a checkout link. Free: 3 operations/day, 5MB per file. Pro: unlimited daily operations, 30MB per operation, 60 req/min, no branding on output.
| Argument | Type | Description |
|---|---|---|
| plan | string | monthly is $9/month; yearly is $72/year (4 months free, 33% off). Defaults to monthly. |
{
"type": "object",
"required": [],
"properties": {
"plan": {
"enum": [
"monthly",
"yearly"
],
"type": "string",
"default": "monthly",
"description": "monthly is $9/month; yearly is $72/year (4 months free, 33% off). Defaults to monthly."
}
}
}Validate an EPUB file for errors, compatibility issues, and spec compliance. Returns JSON with check results. Can optionally auto-fix common issues. Free tier: 5MB/file (10MB for pdf-to-epub, 15MB for split), 3 operations/day, 15 req/min, output includes Epublys branding. Pro ($9/mo): 30MB per operation, unlimited daily operations, 60 req/min, no branding. When a call is refused with daily_limited or a Pro-only error, call the `upgrade_to_pro` tool — it returns a checkout link to hand the user. Details: https://epublys.com/pricing
| Argument | Type | Description |
|---|---|---|
| file* | string | Base64-encoded EPUB file content |
| autoFix | boolean | Auto-fix common issues and return repaired EPUB |
| deepScan | boolean | Perform deep scan (XHTML well-formedness, broken links, etc.) |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"description": "Base64-encoded EPUB file content"
},
"autoFix": {
"type": "boolean",
"default": false,
"description": "Auto-fix common issues and return repaired EPUB"
},
"deepScan": {
"type": "boolean",
"default": true,
"description": "Perform deep scan (XHTML well-formedness, broken links, etc.)"
}
}
}| Comma-separated list of authors |
| language | string |
| subjects | string | Comma-separated list of subjects/tags |
| publisher | string |
| description | string |
| seriesPosition | string |
{
"type": "object",
"required": [
"file"
],
"properties": {
"date": {
"type": "string"
},
"file": {
"type": "string",
"description": "Base64-encoded EPUB file content"
},
"isbn": {
"type": "string"
},
"name": {
"type": "string",
"description": "Original filename — the output is named after its stem (e.g. \"Book.epub\" gives \"Book (compressed).epub\"); without it the output keeps a fixed name"
},
"cover": {
"type": "string",
"description": "Base64-encoded cover image (JPEG or PNG, max 5MB)"
},
"title": {
"type": "string"
},
"author": {
"type": "string"
},
"series": {
"type": "string"
},
"authors": {
"type": "string",
"description": "Comma-separated list of authors"
},
"language": {
"type": "string"
},
"subjects": {
"type": "string",
"description": "Comma-separated list of subjects/tags"
},
"publisher": {
"type": "string"
},
"description": {
"type": "string"
},
"seriesPosition": {
"type": "string"
}
}
}