Skip to main content
Glama
riverai

ebook-translator-mcp

by riverai

MCP for Calibre Ebook Translator

English | 简体中文

Python 3.10+ Plugin v2.4.2 verified License MIT

An MCP server that lets any AI agent (Claude Desktop, Claude Code, Cursor, Cline, dsh, ...) read and write the translation cache of the Calibre Ebook Translator plugin — directly, chunk by chunk, replacing manual copy-paste.

The plugin keeps doing what it is good at (parsing ebooks, splitting text into numbered chunks, merging output). The agent does the translation in your chat window, using any model you like. The book never leaves your machine: everything happens through local SQLite cache files.

插件自检

How it works

The Ebook Translator plugin stores each book's translation progress in a SQLite cache. This server opens those cache files read/write and exposes seven tools: list books, inspect chunk status, read a chunk's original text, read or write its translation, and clear translations for rework. Every response echoes the book id and title so the agent (and you) can always verify which book is being touched.

Key properties:

  • Chunk-addressed: one chunk = one numbered row in the plugin's advanced mode table. chunk_id is the database row id — it never changes, even if you delete other rows in the UI.

  • Alignment-aware: when the plugin's merged translation is enabled, a translation must split into the same number of blank-line-separated blocks as its original, otherwise the plugin highlights the row yellow. The server replicates this exact check and reports aligned on every read and write — you know before reopening the plugin whether a row would go yellow.

  • Safe by construction: only existing cache files are touched; writes are short retrying transactions, safe to run while Calibre is open; SQL is fully parameterized and book_id cannot escape the cache directory.

Related MCP server: Calibre MCP Server

Requirements

  • Calibre with the Ebook Translator plugin (verified against v2.4.2), with a book already segmented in advanced mode (caching enabled, or the advanced-mode window still open)

  • Python 3.10+ (from python.org — on Windows, avoid the Microsoft Store stub, see Troubleshooting)

  • Any MCP client that supports stdio servers

Install and selftest

Option A — run directly with uv (no install, no clone):

uvx --from git+https://github.com/riverai/MCP-for-Calibre-Ebook-Translator ebook-translator-mcp --selftest

Option B — manual:

pip install mcp
# download ebook_translator_mcp.py, then:
python /path/to/ebook_translator_mcp.py --selftest

The self-test prints the cache directory it detected and every book it can see. If your books show up there, the server will work.

Connect your MCP client

The server name below can be anything; command/args is what matters.

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "ebook-translator": {
      "command": "uvx",
      "args": [
        "--from", "git+https://github.com/riverai/MCP-for-Calibre-Ebook-Translator",
        "ebook-translator-mcp"
      ]
    }
  }
}

or, with a local copy and pip install mcp:

{
  "mcpServers": {
    "ebook-translator": {
      "command": "python",
      "args": ["C:/tools/MCP-for-Calibre-Ebook-Translator/ebook_translator_mcp.py"]
    }
  }
}

Claude Code:

claude mcp add ebook-translator -- uvx --from git+https://github.com/riverai/MCP-for-Calibre-Ebook-Translator ebook-translator-mcp
# or: claude mcp add ebook-translator -- python /absolute/path/to/ebook_translator_mcp.py

Cursor (.cursor/mcp.json or ~/.cursor/mcp.json) and Cline (cline_mcp_settings.json): use the same mcpServers JSON as Claude Desktop.

dsh: see dsh/register.yml — note the toolCallTimeoutMs recommendation there.

Remote (Calibre on another machine): start HTTP mode on that machine, then point any streamable-http client at it:

python ebook_translator_mcp.py --transport http --port 8420
# endpoint: http://<that-machine>:8420/mcp

Tools

Tool

What it does

list_books

List every cached book: engine, languages, progress, non-aligned count; keyword filters by title/engine

get_book_info

One book's engine, target language, merge/alignment rule, progress, and the list of non-aligned chunk ids

list_chunks

Lightweight per-chunk status table (no full texts); filter by status (all/untranslated/translated/misaligned) or keyword

get_original

Full original text of one chunk — exactly what the plugin's proofreading panel shows

get_translation

Full translation of one chunk plus the alignment verdict (yellow_warning = will be highlighted in the UI)

write_chunk

Write one chunk's translation; returns alignment state and a warning if the block counts mismatch

delete_translations

Clear translations of the given chunks (for rework); originals untouched

Addressing model

  • book_id is the cache file name, obtained from list_books. Every call echoes book_id + title — check the echo.

  • Segmenting the same book with a different engine / target language / merge setting creates a separate cache (same title, different id). Duplicate titles are flagged duplicate_title; disambiguate by engine / target_lang / merge_length.

  • chunk_id is the database row id: stable forever, but valid only inside its own book. One chunk going wrong never renumbers the others — redo just that chunk (delete_translations + write_chunk).

  • ui_row is the row's display position in the plugin table (for humans to find the row on screen). Never address by it.

Alignment (the yellow highlight)

With merged translation enabled, original and translation must split into the same number of blocks on blank lines (\n\n). If they don't, the plugin highlights the row yellow as "Non-aligned". All read/write tools report:

"alignment": {
  "applicable": true,
  "aligned": false,
  "original_blocks": 17,
  "translation_blocks": 16
}

So an agent can translate, write, and immediately see whether the row would go yellow — and fix it before you ever open Calibre.

  1. list_books → pick the right book_id (watch duplicate_title)

  2. get_book_info → note merge settings and existing non-aligned chunks

  3. list_chunks with status="untranslated" → pick a chunk

  4. get_original → translate it in the chat (keep the block count if merging is on)

  5. write_chunk → check alignment.aligned in the response

  6. Misaligned? Rewrite the chunk (or delete_translations first) until aligned

  7. Repeat until list_chunks with status="misaligned" comes back empty

  8. Human step: reopen advanced mode in Calibre with the same engine/language/merge settings, review, then click Output

Important behaviors

  • Output uses the cache as-is: the plugin's Output step reads whatever translations are in the cache; externally written ones are picked up directly.

  • No live refresh: the advanced-mode table loads once at open. Writes made while it is open are not shown until you reopen it. Also, clicking Save in the UI while the window is open can overwrite externally written rows with stale in-memory data — close the window while an agent is writing in bulk.

  • Settings define the cache file: the cache file name is a hash of book + engine + target language + merge setting. Changing any of these mid-project points at a different cache file.

  • Temporary caches die with the window: if caching is disabled in plugin settings, the cache exists only while the advanced-mode window is open.

Timeouts: "MCP error -32001" but the write actually succeeded

If a write collides with a write lock held by the Calibre UI (any Save/ignore action), the server waits silently — up to ~23s (4 attempts x 5s busy timeout + backoff) — and sends the client nothing meanwhile. Clients whose tool-call timeout is shorter will report -32001: Request timed out first, while the server still completes the write after the lock is released. Two defenses:

  1. Raise the client's tool-call timeout to 60s or more (dsh: toolCallTimeoutMs: 120000, already set in dsh/register.yml).

  2. If you ever see -32001: do not blind-retry the write. Call get_translation first to check whether the translation actually landed; rewrite only if it is missing.

Every lock wait is logged to the server's stderr for diagnosis.

Troubleshooting

Symptom

Cause and fix

list_books finds no caches

Caching is not enabled in plugin settings (or the advanced-mode window was closed and its temp cache vanished). Segment a book in advanced mode first; or point EBOOK_TRANSLATOR_CACHE_DIR at your cache root

Writes land on the wrong book

Same title, multiple caches. Re-check engine / target_lang / merge_length in list_books and stick to one id

Windows: a black console window flashes and the server never starts

The python on PATH is the Microsoft Store stub. Install Python from python.org and use its absolute path in the client config

MCP error -32001 on write_chunk

See the timeouts section — the write probably succeeded; verify with get_translation

Rows show yellow in the plugin

Misaligned chunk: the translation's blank-line block count differs from the original's. Have the agent rewrite that chunk with matching block count

Environment variables

Variable

Meaning

Default

EBOOK_TRANSLATOR_CACHE_DIR

Explicit cache root (highest priority; then the plugin's configured cache_path, then the platform default)

auto-detect

EBOOK_TRANSLATOR_ENGINE_NAME

Engine name recorded next to written translations

MCP

EBOOK_TRANSLATOR_SEPARATOR

Separator used by the alignment check

\n\n

License

MIT

Available Tools

7 tools
delete_translationsA

Clear the translations of the given chunks (for rework); originals and all other fields are untouched. chunk_ids is a list of this book's database cache ids (never change; see list_chunks; valid only inside this book). A chunk that went wrong only needs its own redo — other chunks are not affected. The response echoes book_id and title; verify them.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes
chunk_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden. It discloses that only translations are cleared, originals and other fields remain, and other chunks are unaffected. It also explains the response behavior. It does not explicitly state that the operation is destructive or irreversible, though 'clear' implies it. This is a minor gap, so a 4 is appropriate.

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 concise and front-loaded with the core action, followed by essential parameter details, usage scope, and response verification. Every sentence adds value without fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with an output schema and no annotations, the description covers purpose, usage, behavioral effects, parameter semantics, and response expectations. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/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 explains chunk_ids in detail (database cache ids, never change, see list_chunks, valid only inside this book). It does not explicitly define book_id, but the context 'this book' makes it clear. This adequately covers both parameters, though book_id could be more explicit.

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?

The description clearly states the action: 'Clear the translations of the given chunks' and specifies the purpose 'for rework'. It distinguishes the tool from siblings by explicitly noting that originals and other fields are untouched, making its scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: it tells when to use (for rework), how to obtain valid chunk_ids via list_chunks, and emphasizes that only the specific chunk needs redo ('other chunks are not affected'). It also instructs the agent to verify the echoed book_id and title in the response.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_book_infoA

Details of one book's cache: engine, target language, merge / alignment rules, progress, and the list of non-aligned (yellow- highlighted) chunk ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses what the tool returns (engine, target language, rules, progress, chunk ids) and implies a read-only operation. It does not mention error conditions or side effects, but for a getter this is acceptable; the return contents are well-specified.

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 a single, well-structured sentence that front-loads the resource ('one book's cache') and lists the exact fields returned. There is no redundancy or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has one simple parameter and an output schema (not shown here but referenced), so the description need not detail return format. It lists the key fields an agent would need to know. No essential information is missing for correct invocation.

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%, and the description does not explicitly explain book_id beyond the parameter name. However, the single parameter is self-evidently an identifier, and the description's focus on 'one book' makes its role clear. It adds minimal semantic value beyond the schema.

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?

The description clearly states the tool retrieves details of one book's cache, listing specific fields: engine, target language, merge/alignment rules, progress, and non-aligned chunk ids. This distinguishes it from sibling tools like list_books (listing books) and list_chunks (listing chunks), making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for fetching per-book metadata, contrasting with list_books (multiple books) and get_original/get_translation (content retrieval). However, it does not explicitly name alternatives or state when not to use it, so guidance is clear but implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_originalA

Read the full original text of one chunk — identical to what the UI's proofreading panel shows, so the agent sees the same text a human sees. chunk_id is this book's database cache id (never changes; see list_chunks; valid only inside this book — never use it across books). When merged translation is enabled the response includes blocks: the translation's blank-line block count must equal it to be aligned (otherwise the UI highlights the chunk yellow). include_raw=True additionally returns the raw HTML. The response echoes book_id and title — verify it is the intended book.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes
chunk_idYes
include_rawNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so well. It discloses that the response mirrors the UI panel, that chunk_id is a never-changing database cache id, that it is only valid within the book, that merged-translation responses include blocks with alignment implications, that include_raw returns raw HTML, and that the response echoes book_id and title for verification. This is exceptional transparency.

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?

Every sentence adds meaningful information: main purpose, parameter semantics, cross-book warning, merged-translation alignment caveat, raw HTML option, and response verification. The description is front-loaded with the core purpose and then layers caveats logically. No filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool complexity and the absence of annotations, the description covers all critical context: what the tool returns, how to obtain a valid chunk_id, the cross-book invalidity caveat, the interaction with merged translations, the optional raw HTML flag, and verification of the returned book. The presence of an output schema means detailed return-field explanation is unnecessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It thoroughly explains chunk_id semantics, the meaning and effect of include_raw, and notes that book_id/title are echoed for verification. The only minor gap is that book_id itself is not directly defined, though its role is inferable from the sibling list_books tool.

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?

The description opens with a specific verb and resource: 'Read the full original text of one chunk.' It also clarifies this is the exact text the human UI proofreading panel shows, which clearly distinguishes it from translation-related tools like get_translation. The purpose is immediately unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use the tool: when the full original text of a chunk is needed. It also instructs the agent to obtain chunk_id via list_chunks and warns that the ID is scoped to the current book. It stops short of explicitly naming alternatives or saying when not to use it, but the usage context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_translationA

Read the full translation and alignment state of one chunk — identical to what the UI's proofreading panel shows. chunk_id is this book's database cache id (never changes; see list_chunks; valid only inside this book — never use it across books). translation is null when the chunk is untranslated. When merged translation is enabled the response carries the alignment verdict (whether translation and original have equal blank-line block counts, i.e. whether the UI highlights the row yellow). The response echoes book_id and title — verify it is the intended book.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes
chunk_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It explains that translation is null for untranslated chunks, that the alignment verdict appears only when merged translation is enabled, and that the response echoes book_id and title. This covers key behavioral quirks well, though it does not fully address error or edge conditions.

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 five sentences, each carrying a distinct useful fact, with the purpose front-loaded. Parentheticals add explanatory value rather than padding, though the overall text is dense and could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no annotations and an output schema, the description covers parameter provenance, null behavior, conditional alignment verdict, and response verification. It could be more explicit about when to prefer this over sibling tools, but it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must add parameter meaning. It thoroughly explains chunk_id as a stable, book-scoped cache id obtained from list_chunks and never reused across books. It gives less direct guidance on book_id, but the verification note about the echoed book_id 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?

The description states a specific read operation on one chunk and names the data returned: full translation and alignment state. It clearly distinguishes this tool from siblings like get_original (source text) and write_chunk (write operation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for correct use: chunk_id comes from list_chunks, is book-scoped, and must never be reused across books. It also advises verifying book_id against the echoed response. It does not explicitly name when to avoid this tool in favor of a sibling, but the context is strong enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_booksA

List all cached translation books with progress (including temporary caches). The returned id is the book_id used by every other tool. Note: segmenting the same book with different engine / target language / merge settings produces multiple caches (same title, different ids) — duplicate titles are flagged duplicate_title=true; disambiguate by engine/target_lang/merge_length and pick one, since picking the wrong book makes every later read/write land on the wrong cache. keyword fuzzy-filters by title/engine/language (useful when there are many books). persistent=false means a temporary cache (destroyed as soon as the advanced-mode window closes).

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does so thoroughly. It discloses that the list includes temporary caches, explains duplicate cache generation, defines the duplicate_title flag, warns about the consequences of picking the wrong id, and clarifies that persistent=false means the cache is destroyed when the advanced-mode window closes.

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 information-dense without fluff. It front-loads the core purpose, then introduces caveats and filtering in a logical order. Every sentence adds operational value, including the disambiguation warning and persistence note, making the length justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a discovery/list tool with no annotations, the description provides all essential operational context: what is listed, what the id means, how to handle duplicates, how to filter, and what persistent=false implies. An output schema exists, so the return-value format does not need to be described in prose. The descrption is complete for correct tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only provides the keyword property with a default and no description, so schema coverage is 0%. The description fully compensates by explaining that keyword fuzzy-filters by title/engine/language and is useful when there are many books. This goes well beyond the bare schema.

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?

The description uses a specific verb and resource: 'List all cached translation books with progress'. It clearly distinguishes this tool from siblings by emphasizing it returns the book_id used by every other tool, and adds the important disambiguation context about duplicate titles and cache variants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains the primary use case: discover books and retrieve the book_id that all other tools depend on. It also gives practical guidance on using keyword to filter and on disambiguating duplicates. It does not explicitly name sibling alternatives or state when not to use the tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_chunksA

Lightweight list of every chunk id of one book with status, without full texts (to keep context small); mirrors the left-hand table of the UI. status options: all / untranslated / translated / misaligned (the UI's yellow rows); keyword fuzzy-matches original or translation text. Each item contains: chunk_id (for addressing; never changes; valid only inside this book), ui_row (UI display position, human reference only), status, alignment, block count, character count and a one-line preview. Always address chunks as book_id + chunk_id — never use ui_row, and never carry this book's chunk_id over to another book. The response echoes book_id and title so the caller can verify it is working on the intended book.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoall
book_idYes
keywordNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses it returns specific fields, that it is lightweight (no full texts), and warns about addressing scope. It doesn't explicitly state read-only or rate limits, but the read-only nature is implied by 'list'. It adds good behavioral context beyond a simple verb.

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 block but well-structured, front-loading the purpose and then detailing parameters and output. It is slightly long but every sentence contributes—no filler. The addressing warning is critical and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a listing tool with an output schema, the description covers purpose, parameters, output fields, and critical usage constraints. It doesn't explain the output format (handled by schema) or mention pagination, but it is complete enough for an agent to call it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/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 explains book_id (required, scopes the list), status (enum-like options: all/untranslated/translated/misaligned), and keyword (fuzzy-match on original or translation). It also clarifies the meaning of returned fields like ui_row and chunk_id, adding value well beyond the bare schema.

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?

The description clearly states the tool's function: a lightweight list of chunk ids for one book, with status, without full texts. It explicitly distinguishes from siblings like get_book_info and get_translation by focusing on chunk listing and the UI mirror.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: how to filter by status, how keyword matches, and critical addressing rules (use book_id + chunk_id, never ui_row, do not carry chunk_id across books). It also implies when to use this (for overview) versus other tools for full content or mutations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_chunkA

Write the full translation of one chunk (stripped before writing, matching plugin behavior; engine name and target language are recorded). chunk_id is this book's database cache id (never changes; see list_chunks; valid only inside this book). Right after writing, the tool replicates the UI alignment check and returns the aligned state — mismatched block counts come with a warning (the chunk will be highlighted yellow in the UI). With overwrite=False an existing translation is skipped. The response echoes book_id and title: writing is irreversible, verify it is the intended book first.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes
chunk_idYes
overwriteNo
translationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that the translation is stripped before writing to match plugin behavior, that engine name and target language are recorded, that a UI alignment check is replicated and mismatched block counts produce a warning, and that writing is irreversible. This goes well beyond a simple 'writes a chunk' statement.

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 dense but every sentence adds information: stripping behavior, id semantics, alignment check, overwrite behavior, and irreversibility. It is front-loaded with the core action. Slightly long, but no filler; a 4 reflects that it earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (mutation, alignment check, overwrite semantics, book-scoped ids) and the absence of annotations, the description covers all critical operational aspects. The output schema exists, so return values need not be detailed. An agent has enough to call this correctly and avoid destructive mistakes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains chunk_id as the book's database cache id and clarifies overwrite=False behavior. It does not detail book_id or translation format, but the description's clarification of the two most subtle parameters is meaningful. A 4 is appropriate because it adds significant semantic value without fully documenting every parameter.

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?

The description opens with a specific verb and resource: 'Write the full translation of one chunk.' It also distinguishes itself from siblings by noting the chunk_id is this book's database cache id and referencing list_chunks. The scope is clear and the tool is not confused with get_translation or delete_translations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says chunk_id is valid only inside this book, warns to verify book_id because writing is irreversible, and explains overwrite=False behavior. It also references list_chunks as the source of chunk ids, giving the agent a clear path for correct invocation. This is strong usage guidance.

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.

  1. 7 tool updatesv0.1.0
    • First observeddelete_translations
    • First observedget_book_info
    • First observedget_original
    • First observedget_translation
    • First observedlist_books
    • First observedlist_chunks
    • First observedwrite_chunk

TDQS

A4.7/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct resource and action: book-level info vs chunk-level read/write/delete. The naming and descriptions clearly separate get_original (source text) from get_translation (target text and alignment), and write_chunk from delete_translations. There is no functional overlap between any two tools.

Naming Consistency5/5

All tool names use a consistent verb_noun pattern in snake_case: get_book_info, list_books, list_chunks, get_original, get_translation, write_chunk, delete_translations. The verbs (get, list, write, delete) accurately reflect the operation, and nouns specify the target resource. The convention is uniform across the set.

Tool Count5/5

With 7 tools, the server is squarely in the well-scoped range for a specialized ebook translation cache manager. Each tool covers a necessary step: discovering books, inspecting chunks, reading/writing translations, and clearing bad ones. No redundant or vestigial tools are present.

Completeness5/5

The tool set covers the full review/edit lifecycle: list and inspect books, list chunks, read original and translation, write corrected translations, and delete translations for rework. Alignment state is surfaced in get_translation and write_chunk, and get_book_info summarizes misaligned chunks. There are no dead ends in the typical proofreading workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides AI agents with research capabilities for local Calibre e-book libraries, including fulltext search across titles, ISBNs, and comments, plus structured excerpt retrieval from books.
    2
    GPL 3.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to read and navigate EPUB files through 13 specialized tools for pagination, full-text search, metadata access, and footnote resolution. Supports session-based reading with table of contents navigation and chapter summaries.
    MIT