ebook-translator-mcp
Click on "Deploy 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., "@ebook-translator-mcpTranslate the untranslated chunks of 'Dune' one by one."
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.
MCP for Calibre Ebook Translator
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_idis 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
alignedon 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_idcannot 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 --selftestOption B — manual:
pip install mcp
# download ebook_translator_mcp.py, then:
python /path/to/ebook_translator_mcp.py --selftestThe 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.pyCursor (.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/mcpTools
Tool | What it does |
| List every cached book: engine, languages, progress, non-aligned count; |
| One book's engine, target language, merge/alignment rule, progress, and the list of non-aligned chunk ids |
| Lightweight per-chunk status table (no full texts); filter by |
| Full original text of one chunk — exactly what the plugin's proofreading panel shows |
| Full translation of one chunk plus the alignment verdict ( |
| Write one chunk's translation; returns alignment state and a |
| Clear translations of the given chunks (for rework); originals untouched |
Addressing model
book_idis the cache file name, obtained fromlist_books. Every call echoesbook_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 byengine/target_lang/merge_length.chunk_idis 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_rowis 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.
Recommended workflow
list_books→ pick the rightbook_id(watchduplicate_title)get_book_info→ note merge settings and existing non-aligned chunkslist_chunkswithstatus="untranslated"→ pick a chunkget_original→ translate it in the chat (keep the block count if merging is on)write_chunk→ checkalignment.alignedin the responseMisaligned? Rewrite the chunk (or
delete_translationsfirst) until alignedRepeat until
list_chunkswithstatus="misaligned"comes back emptyHuman 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:
Raise the client's tool-call timeout to 60s or more (dsh:
toolCallTimeoutMs: 120000, already set indsh/register.yml).If you ever see -32001: do not blind-retry the write. Call
get_translationfirst 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 |
| 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 |
Writes land on the wrong book | Same title, multiple caches. Re-check |
Windows: a black console window flashes and the server never starts | The |
| See the timeouts section — the write probably succeeded; verify with |
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 |
| Explicit cache root (highest priority; then the plugin's configured | auto-detect |
| Engine name recorded next to written translations |
|
| Separator used by the alignment check |
|
Related projects
bookfere/Ebook-Translator-Calibre-Plugin — the plugin this server talks to (not affiliated; this is an independent third-party tool)
License
Available Tools
7 toolsdelete_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.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | ||
| chunk_ids | Yes |
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. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes |
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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | ||
| chunk_id | Yes | ||
| include_raw | 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, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | ||
| chunk_id | Yes |
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, 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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | all | |
| book_id | Yes | ||
| keyword | 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, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | ||
| chunk_id | Yes | ||
| overwrite | No | ||
| translation | Yes |
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, 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.
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.
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.
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.
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.
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.
7 tool updates
v0.1.0- First observed
delete_translations - First observed
get_book_info - First observed
get_original - First observed
get_translation - First observed
list_books - First observed
list_chunks - First observed
write_chunk
TDQS
Scored across 7 tools
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.
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.
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.
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
Related MCP Connectors
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Read and write your Fresh Jots notes from Claude, Cursor, and any MCP client.
Shared knowledge cache for AI coding agents — reuse an answer once it exists.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides 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.2GPL 3.0
- AlicenseBqualityCmaintenanceConnects AI agents to Calibre ebook libraries for searching, reading, and managing digital collections. It supports metadata updates, format conversion, and full-text content searches while providing granular permission controls for library access.720MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to read and write JSON translation files (i18n, i18next, react-i18next) via the Model Context Protocol.6 npm2-