Skip to main content
Glama

audiobook_mcp

An MCP server that turns a single-file MP3/M4A audiobook plus its EPUB into a properly chaptered M4B — the audiobook-mp3-to-m4b skill's pipeline, exposed as MCP tools instead of a script you shell out to by hand.

Chapter boundaries are found by locating the real silence gap at each chapter transition and anchoring the search for chapter N+1 on chapter N's actual detected boundary — not on a bookseller's rounded displayed durations (which drift over a long book) or on EPUB word-count pacing alone (dialogue-heavy vs. descriptive passages read at different speeds). Because that chain starts from chapter 1, an unconfirmed guess at chapter 1's own start (most commonly a missed opening-credits/intro segment) would otherwise throw off every chapter behind it — so before the chain runs at all, chapter 1's boundary is confirmed by transcribing candidate gaps near the start of the file (via whisper.cpp) and checking each against the EPUB's own chapter-1 text (verify_first_chapter, on by default; falls back to a silence-only guess if whisper.cpp isn't configured). See audiobook_mcp/pipeline.py's module docstring for the full rationale, including how it filters out the short "decoy" gap some publishers place a few seconds after the real transition.

Why this is a resumable job, not one blocking tool call

A 20+ hour audiobook can take longer to fully process than most MCP clients will happily block a single tool call for. So conversion is modeled as a job: audiobook_start_conversion creates it, audiobook_continue_conversion (fine-grained) or audiobook_run_until_done (loops internally) advance it in bounded time chunks and checkpoint to disk after every unit of progress, and audiobook_get_status reads progress without doing any work. Call continue_conversion/run_until_done repeatedly until the response's "done" field is true. This is the same checkpoint-and-resume design the underlying skill uses for the same reason, generalized from a hard 45-second sandbox cap to "whatever your MCP client is comfortable with."

Related MCP server: Scribe MCP

Setup

Requires Python 3.10+, ffmpeg/ffprobe on PATH. exiftool is also needed, but only for audiobook_embed_cover_metadata -- every other tool works without it (missing exiftool is reported clearly by that one tool, not a silent skip). Likewise, whisper.cpp is recommended but not required: build/install it, put its CLI binary (whisper-cli or whisper-cpp) on PATH (or point AUDIOBOOK_MCP_WHISPER_BIN at it directly), download a GGML model with its models/download-ggml-model.sh script, and set AUDIOBOOK_MCP_WHISPER_MODEL to that model file's path. It's used by audiobook_transcribe_chapter_boundary (an on-demand spot check) and, by default, by audiobook_start_conversion's verify_first_chapter step (an automatic check of chapter 1's boundary before the rest of the book is aligned). Without it, verify_first_chapter falls back to a silence-only guess and logs a warning instead of failing the job -- so whisper.cpp is worth setting up for any book that might have an intro, but nothing breaks without it. No Python speech-recognition package is installed by this project -- like ffmpeg and exiftool, whisper.cpp is shelled out to as an external binary, and a missing binary/model is reported clearly rather than silently skipped.

cd audiobook_mcp
pip install -e .
# or: pip install -r requirements.txt

This server targets v2.x of the MCP Python SDK (mcp>=2.0,<3.0.0). v2 renamed FastMCP to MCPServer (now imported from mcp.server.mcpserver, along with Context/Image) and changed the @mcp.tool() decorator's annotations parameter from a plain dict to a mcp.types.ToolAnnotations object, with title moving out to become the decorator's own title= kwarg. Context.report_progress()/.info() and the Image class kept the same call shape.

Register with an MCP client

Claude Code / Claude Desktop (claude_desktop_config.json or equivalent):

{
  "mcpServers": {
    "audiobook": {
      "command": "python3",
      "args": ["-m", "audiobook_mcp.server"],
      "cwd": "/absolute/path/to/audiobook_mcp"
    }
  }
}

Or, after pip install -e ., use the installed console script instead of -m audiobook_mcp.server:

{
  "mcpServers": {
    "audiobook": { "command": "audiobook-mcp" }
  }
}

Tools

Tool

Purpose

audiobook_inspect_epub

Preview an EPUB's chapters/metadata/cover without starting a job.

audiobook_start_conversion

Create (or resume) a job; runs the fast EPUB-parse stage only.

audiobook_continue_conversion

Advance a job by one bounded chunk of work.

audiobook_run_until_done

Loop continue_conversion internally up to a time cap.

audiobook_get_status

Read a job's progress without doing work.

audiobook_list_conversions

List known jobs (paginated).

audiobook_inspect_chapter_boundary

List silence gaps found around a chapter's recorded boundary.

audiobook_render_boundary_waveform

Render a waveform PNG around a boundary, for a visual spot-check.

audiobook_transcribe_chapter_boundary

Transcribe the audio at a boundary via whisper.cpp, for a text-based spot-check.

audiobook_patch_chapter_boundary

Manually fix a flagged/fallback chapter boundary.

audiobook_verify_output

Sanity-check a finished M4B (chapters, duration, cover art).

audiobook_cancel_conversion

Remove a job (optionally deleting its scratch files).

audiobook_lookup_book_metadata

Look up book/audiobook metadata + cover candidates across free APIs.

audiobook_fetch_cover_image

Download a chosen cover URL to disk.

audiobook_embed_cover_metadata

Write a metadata record into a cover image's EXIF/XMP/IPTC tags.

Typical flow: start_conversion → loop run_until_done (or continue_conversion) until done. The first thing that loop does, before aligning any other chapter, is confirm chapter 1's own boundary by transcript (verify_first_chapter, on by default -- see get_status's alignment.chapter_1_anchor for its outcome); everything from chapter 2 onward chains forward from whatever chapter 1's boundary turns out to be, so getting it right up front avoids having to patch every later chapter individually if it were wrong. Once done, if get_status still shows fallback_chapters or word_count_warnings for some other chapter, use inspect_chapter_boundary (+ optionally render_boundary_waveform for a visual check, or transcribe_chapter_boundary for a text check against the EPUB's own chapter opening) to find the right cut, then patch_chapter_boundary and resume → finally verify_output on the result.

flowchart TD
    A["start_conversion"] --> V["verify_first_chapter:\ntranscribe candidates near\nfile start vs. EPUB ch.1 text"]
    V --> B["loop: run_until_done\n(or continue_conversion) --\nchapters 2..N chain forward\nfrom chapter 1's boundary"]
    B --> C{"done?"}
    C -- "no" --> B
    C -- "yes" --> D{"get_status shows\nfallback_chapters or\nword_count_warnings?"}
    D -- "no" --> G["verify_output"]
    D -- "yes" --> E["inspect_chapter_boundary"]
    E --> F1["render_boundary_waveform\n(visual check)"]
    E --> F2["transcribe_chapter_boundary\n(text check vs. EPUB)"]
    F1 --> P["patch_chapter_boundary"]
    F2 --> P
    P -- "resume" --> B

The last three tools are a mostly-independent workflow (ported from the book-metadata-fetch skill, see third_party/book-metadata-fetch/ for the original and evaluations/README.md-adjacent test coverage in tests/test_metadata_fetch.py): lookup_book_metadata (by title/author, no local files needed) → review its _conflicts before trusting a field → fetch_cover_image on whichever candidate has the best measured pixel dimensions → embed_cover_metadata on the downloaded file. Same guardrails as the source skill: personal research/cataloging use, no Amazon/Audible page scraping (that needs a browser tool this server doesn't have -- Tier 1 here is the ceiling), never loop it over long title lists. The one bridge between the two workflows: pass fetch_cover_image's downloaded path as start_conversion's cover_image_path to use a fetched cover instead of whatever (if anything) is in the source EPUB.

Jobs, state, and where things live

  • Each job's state of record is <out_dir>/.state/<job_id>/state.json — self-contained (it stores its own config), so it's the source of truth even if the registry below is lost.

  • A lightweight registry mapping job_id -> work_dir persists at $AUDIOBOOK_MCP_HOME/registry.json (default ~/.audiobook_mcp/), so jobs survive a server restart without the caller re-supplying paths.

  • Once a job reaches "done", its encoded segments and assembly scratch data are deleted automatically; the checkpoint and logs remain.

Security notes

This server operates with the filesystem permissions of the process running it, by design — like a CLI tool, not a multi-tenant web service. mp3_path/epub_path/out_dir/m4b_path are used as given (validated for existence/type, not sandboxed to a subtree). Only run this server in contexts where you trust whoever can call its tools with your local filesystem access. All ffmpeg/ffprobe invocations use argument lists (never shell=True), so filenames with spaces or shell metacharacters can't cause command injection.

Testing

uv sync --group dev
uv run pytest -v

tests/conftest.py's session-scoped fixture_dir fixture calls evaluations/make_fixture.py to synthesize a tiny 4-chapter "book" (EPUB + a ~40s MP3 built from distinct tones and real silence gaps, including one deliberately-placed decoy gap) so the full pipeline — alignment, decoy filtering, encoding, muxing, cover embedding, delivery — can be exercised in seconds without a real audiobook. test_smoke.py runs the actual Pipeline class (the same code every tool in server.py calls) against it end-to-end and asserts on the result, including an independent re-scan of the audio to confirm the real gap (not the decoy) was chosen.

audiobook_lookup_book_metadata's four source APIs (googleapis.com/openlibrary.org/api.audible.com/itunes.apple.com) aren't reachable from every environment (they weren't from the one this server was built in — see that test file's module docstring). Its ported reconciliation/ranking logic is instead tested against fixture payloads built from the source skill's own documented failure modes (series volume mismatches, far-future re-issues, publisher/date conflicts) in tests/test_metadata_fetch.py, which also runs a real exiftool embed+readback. tests/test_tool_integration.py drives the actual MCP tool functions (Pydantic validation included) via a file:// URL so the download code path is real too. Before relying on lookup_book_metadata in production, also run a handful of lookups somewhere with network access to those four APIs.

See evaluations/README.md for the Phase 4 agent-facing evaluation set and why it's built the way it is.

What's deliberately out of scope (v1)

  • No-EPUB fallback. The skill documents a manual workaround for books with no EPUB at all (hand-authored chapter durations instead of word-count-based sanity checking). Not implemented as a tool here — EPUB is a required input, as in the skill's own run.py.

  • Concurrent processing of the same job from two callers is guarded by an in-process lock per job_id, but the server assumes a single server process (not multiple replicas sharing one out_dir).

  • Tier 2 Amazon/Audible retail-page fallback from the book-metadata-fetch skill (see third_party/book-metadata-fetch/) isn't reimplemented: it depends on a browser automation tool this server doesn't have. audiobook_lookup_book_metadata covers Tier 1 (Google Books, Open Library, Audible's public catalog search, Apple iTunes) only; a calling agent with its own browser tool may attempt the source skill's Tier 2 procedure manually, subject to the same guardrails (never bypass a CAPTCHA/sign-in wall, one on-demand lookup per title).

Available Tools

15 tools
audiobook_cancel_conversionRemove a conversion jobA
DestructiveIdempotent

Remove a job from the registry. By default this only forgets the job_id (the on-disk state under out_dir/.state/ is left alone, so audiobook_start_conversion with the same mp3/epub/out_dir would still resume it). With delete_files=True, also deletes that scratch directory -- the original mp3/epub and anything already delivered into out_dir itself are never touched either way.

Args: params (CancelConversionInput): - job_id (str). - delete_files (bool): also delete the job's working directory.

Returns: str: JSON {"job_id": str, "removed_from_registry": true, "files_deleted": bool} or {"error": ...} if job_id is unknown.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the annotations: by default it only forgets the job_id, leaves out_dir/.state/<job_id> intact, and with delete_files=True deletes only the scratch directory. It explicitly states that original mp3/epub and already-delivered files in out_dir are never touched, even when delete_files is true. This aligns with and enriches the destructiveHint=true annotation without contradicting it.

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 well-structured with a concise prose section followed by Args and Returns sections. It is front-loaded with the core behavior and adds essential nuances about disk state and delete semantics. It is slightly redundant with the schema (e.g. repeating delete_files semantics), but the added clarity about what is and is not deleted earns its place.

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 description fully covers what an agent needs to call this tool correctly: the registry-only default, the disk-deletion behavior, the boundary of what is never touched, the input parameters, and the return format including the error case. With annotations already signaling destructive and idempotent behavior, no important operational context is missing.

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?

Context signals indicate 0% schema description coverage, so the description must compensate for parameter meaning. It explains job_id as the registry key and delete_files as controlling whether the working directory is deleted. It also includes the default behavior ('By default this only forgets the job_id') and the exact effect of delete_files=True. The description does not explicitly state that job_id comes from audiobook_start_conversion, but the schema itself does, so this is adequately covered.

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 begins with a specific verb and resource: 'Remove a job from the registry.' It goes beyond the title by clarifying that removal is from the registry only, not necessarily from disk, and it names the related start tool implicitly through the resume behavior. This clearly distinguishes the tool from siblings like audiobook_start_conversion and audiobook_continue_conversion.

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 effect of calling the tool with default settings versus delete_files=True, and gives the important consequence that the same job_id/mp3/epub/out_dir can resume a forgotten job. It does not explicitly name alternatives or say 'use this when...', but the context and behavioral consequences are clear enough for an agent to decide.

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

audiobook_continue_conversionAdvance a conversion job by one bounded chunk of workA

Do up to time_budget_seconds of work on a job (aligning chapters, encoding segments, assembling, or delivering the final file -- whichever stage it's currently in), checkpoint to disk, and return. Re-call this with the same job_id, or use audiobook_run_until_done to loop automatically, until the response's "done" field is true.

Safe to call again immediately if a previous call errored partway through a stage -- work already checkpointed is never redone.

Args: params (ContinueConversionInput): - job_id (str): from audiobook_start_conversion. - time_budget_seconds (float): stop and checkpoint after roughly this long (5-300s, default 60).

Returns: str: JSON status object -- see audiobook_get_status's Returns schema, which this shares exactly.

Error Handling: - "unknown_job" if job_id isn't registered. - ffmpeg/encoding failures surface with ffmpeg's own error text tail included; the job's checkpoint is untouched so retrying (after e.g. freeing disk space) picks up where it left off.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing checkpointing, safe re-invocation after partial failures, that checkpointed work is never redone, and exact error outcomes including 'unknown_job' and ffmpeg failure behavior. This gives a full behavioral model for a mutating tool.

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 front-loaded with the core behavior, then organized into Args, Returns, and Error Handling sections. Every sentence adds necessary operational information without redundancy or filler.

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 description covers invocation, looping behavior, retry semantics, error cases, return-value reference, and parameter constraints. With an output schema available and a clear pointer to audiobook_get_status for the return schema, nothing needed to call the tool correctly is missing.

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 description coverage is reported at 0%, so the description must carry the parameter explanation. It does: job_id is sourced from audiobook_start_conversion, and time_budget_seconds is given with its operational meaning, range (5-300s), and default of 60.

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 verb ('Advance'), a clear resource ('a conversion job'), and the bounded-chunk behavior ('Do up to time_budget_seconds of work ... checkpoint to disk, and return'). It also names the stages the job moves through, which distinguishes it from related job-management tools and from audiobook_run_until_done.

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 tells the agent to re-call with the same job_id until 'done' is true, and names audiobook_run_until_done as the automatic-loop alternative. It also gives retry guidance after errors, making when-to-use and how-to-continue unambiguous.

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

audiobook_embed_cover_metadataEmbed a metadata record into a cover image's EXIF/XMP/IPTC tagsA
DestructiveIdempotent

Write a book metadata record into an existing image file's EXIF/XMP/IPTC tags via exiftool (title, creator/artist, description, publisher, copyright, date, keywords, source URL, rating). Narrator and length have no standard EXIF equivalent, so the complete record is also stamped into the JPEG Comment field as JSON so nothing is lost. Overwrites image_path's own metadata in place -- the image's pixel data is untouched.

Requires exiftool on PATH; if it's missing this tool errors rather than silently skipping the embed (per the source skill's guardrail).

Args: params (EmbedCoverMetadataInput): - image_path (str): the image file to tag (typically the output of audiobook_fetch_cover_image). - metadata (BookMetadataInput): the record to embed, e.g. straight from audiobook_lookup_book_metadata's "record". - dry_run (bool): if true, return the exiftool command without writing anything.

Returns: str: JSON {"command": [str, ...], "output": str|null, "dry_run": bool} or {"error": ...} if image_path doesn't exist or exiftool fails/is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already signal destructive and idempotent behavior, and the description reinforces and expands on them by disclosing that metadata is overwritten in place while pixel data is untouched. It also reveals a key guardrail: missing exiftool produces an error rather than a silent skip, and that a JSON copy is stamped into the JPEG Comment so nothing is lost.

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 well organized into action, side effects, dependency, arguments, and return value sections, with no filler. Every sentence earns its place, especially the exiftool guardrail and the JSON Comment fallback explanation.

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 mutating tool with a nested input schema, the description covers prerequisites, failure modes, destructive behavior, dry-run semantics, and the exact return shape. Nothing an agent needs to call the tool safely and correctly is missing.

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?

Even though top-level schema description coverage is 0%, the description compensates by explaining the role of each argument, including that dry_run returns the command without writing. It also connects image_path and metadata to sibling tool outputs, which the schema alone does not convey, though it does not enumerate every nested BookMetadataInput field.

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 action and resource: writing a book metadata record into an existing image file's EXIF/XMP/IPTC tags via exiftool. It also distinguishes the tool from siblings by noting image_path typically comes from audiobook_fetch_cover_image and metadata from audiobook_lookup_book_metadata.

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 workflow context: image_path is typically the output of audiobook_fetch_cover_image and metadata is expected from audiobook_lookup_book_metadata's record. It also explains dry_run's purpose, though it does not explicitly name alternatives or state when not to use the tool.

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

audiobook_fetch_cover_imageDownload a cover image URL to diskA

Download a specific cover image URL (typically one from audiobook_lookup_book_metadata's covers array -- pick by measured width/height, not source order or URL) to out_dir, and report its real decoded pixel dimensions. Saved as "_.jpg" (or without the author suffix if none given), matching the source skill's naming convention.

Args: params (FetchCoverImageInput): - cover_url (str): the image URL to download. - out_dir (str): destination directory (created if missing). - title/author (str): used to build the filename. - overwrite (bool): default False errors instead of clobbering an existing file with the same name.

Returns: str: JSON {"path": str, "width": int|null, "height": int|null, "bytes": int} or {"error": ...} on failure.

Error Handling: - Errors (not overwrites) if a file with the computed name already exists and overwrite=False. - Network failures surface with the underlying reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false, destructiveHint=false, and idempotentHint=false. The description goes beyond to explain overwrite behavior (errors by default, matching source skill's 'ask before overwriting'). It also discloses that out_dir is created if missing and that network failures surface the reason. This is rich context beyond the annotations. However, the description doesn't explicitly state that the file is written to disk in a non-idempotent way (repeated calls error unless overwrite=true), but that's already implied by fetch and overwrite semantics.

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 two paragraphs plus structured sections, but it is front-loaded with the most critical information (picking by dimensions, naming convention). It's compact and each sentence earns its place. Slight redundancy: the 'overwrite' behavior is mentioned in the args list and Error Handling, but that's minor.

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 output schema exists, the description needn't list return fields, but it does anyway. It covers error scenarios (network failures, existing file without overwrite). It also explains naming convention fully. For a simple download tool, nothing is missing: how to call, what happens, and what to expect on output.

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?

The schema description coverage is 0%, so the description must compensate. It does: each parameter's purpose is described (cover_url for download, out_dir for destination, title/author for filename, overwrite for conflict handling). The description also adds that title/author are sanitized for the filename, a detail beyond the schema. However, it doesn't explain the film name pattern in detail beyond the example, but the example is enough.

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 verb ('Download'), the resource ('a specific cover image URL'), and the key distinction from siblings: it picks by measured width/height, not source order. It clearly differentiates from audiobook_lookup_book_metadata, which returns the covers array, and audiobook_embed_cover_metadata, which embeds metadata, avoiding confusion.

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 to use URLs from audiobook_lookup_book_metadata's covers array and warns to pick by measured dimensions. It also clarifies 'when not to use': selecting by source order or URL is incorrect. It implies when to use it (after metadata lookup, before embedding) without naming alternatives, which is sufficient for a downloader.

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

audiobook_get_statusRead a conversion job's current statusA
Read-onlyIdempotent

Read a job's current progress WITHOUT doing any work -- safe to call as often as you like, including while another audiobook_continue_conversion/audiobook_run_until_done call might be in flight.

Args: params (JobIdInput): - job_id (str): from audiobook_start_conversion.

Returns: str: JSON with schema: { "stage": str, # "extract"|"align"|"encode"|"assemble"|"deliver"|"done" "done": bool, "status_line": str, # most recent human-readable progress line "overall_progress": float, # 0.0-1.0 across the WHOLE job, comparable # across separate continue_conversion/ # run_until_done calls -- suitable for a # progress bar. Weighted by each stage's # typical share of total time (encode # dominates), not just "stages done / 6". "overall_progress_pct": float, # overall_progress * 100, rounded to 1 decimal "book": {"title", "author", "series", "series_index", "chapter_count", "cover_found"} | null, "alignment": { # present once alignment has started "chapters_aligned": int, "chapters_total": int, "low_confidence_chapters": [int, ...], # spot-check these "fallback_chapters": [int, ...], # these need a fix "manual_overrides": [int, ...], "outro_detected": bool } | absent, "encoding": {"segments_encoded": int, "segments_total": int} | absent, "word_count_warnings": [ {"n": int, "title": str, "actual_duration_s": float, "expected_duration_s": float} ] | absent, # segments whose duration deviates >30% from EPUB word-count pace "assembled_path": str | absent, "delivery": {"bytes_done": int, "bytes_total": int} | absent, "final_output": str | absent, # present once stage == "done" "recent_log": [str, ...] # last 10 status lines } or {"error": str, "error_type": str} if job_id is unknown.

Examples: - Use when: checking whether a long-running job has finished yet. - Use when: deciding whether fallback_chapters/word_count_warnings need audiobook_inspect_chapter_boundary + audiobook_patch_chapter_boundary before trusting the output.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds crucial behavioral context: it is safe to call as often as desired even while other job-affecting calls run, and it provides a detailed explanation of progress semantics (weighted by stage time, not just stage count). It also discloses the error response structure. No contradictions with annotations.

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 lengthy but well-organized into purpose, Args, Returns (with a full JSON schema), and Examples. The return schema is essential given the tool's complex output, and the examples provide practical context. It is front-loaded with the safety note, and every section earns its place, though it could be trimmed slightly without losing clarity.

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 description is fully self-contained: it explains the tool's purpose, when to use it, the exact return schema with field meanings, error handling, and even provides usage examples. The tool is complex (multiple stages, weighted progress, various optional fields), and the description covers all necessary details for correct invocation and interpretation. There is no output schema annotation, but the inline schema fully compensates.

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?

The only parameter is job_id, and the schema already describes it as 'Job id returned by audiobook_start_conversion.' The description repeats this same source information without adding new details. Since schema description coverage is reported as 0% but the schema itself has a clear description, the tool adds minimal extra value beyond the schema. The parameter is simple and self-explanatory, so a baseline of 3 is appropriate.

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 explicitly states 'Read a job's current progress WITHOUT doing any work' which clearly identifies the action and resource, and differentiates from sibling tools like audiobook_continue_conversion and audiobook_run_until_done. It is a specific verb (read) with a clear object (job progress), and the emphasis on being read-only and safe to call often distinguishes it from mutation tools.

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 when-to-use scenarios: 'Use when: checking whether a long-running job has finished yet' and 'Use when: deciding whether fallback_chapters/word_count_warnings need...' It also notes it can be called while other conversions are in flight, clarifying it is safe to poll. This gives clear guidance on when to select this tool over alternatives.

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

audiobook_inspect_chapter_boundaryList silence gaps found around a chapter's recorded boundaryA
Read-onlyIdempotent

Re-scan the audio around a chapter's currently recorded boundary and list every silence gap found, so you (or the user) can judge whether the recorded boundary is the right one -- most useful for a chapter that showed up in fallback_chapters or word_count_warnings from audiobook_get_status. Does not change anything; follow up with audiobook_render_boundary_waveform for a visual, or audiobook_patch_chapter_boundary once you've picked the right gap.

Args: params (InspectBoundaryInput): - job_id (str), chapter_index (int, 1-based). - window_seconds (float): half-width of the search region around the current boundary (default 30). - noise_db / min_silence (float): silencedetect thresholds -- widen noise_db (e.g. -25) for a loud passage, shorten min_silence to catch briefer pauses.

Returns: str: JSON with schema: { "chapter_index": int, "current_boundary_seconds": float, "search_window": {"start": float, "end": float}, "gaps_found": [ {"start": float, "end": float, "duration": float, "distance_from_current_boundary": float} ] # sorted by distance from the current boundary } or {"error": ...} if the chapter hasn't been aligned yet.

Error Handling: - Raises a clear error if chapter_index hasn't been reached by alignment yet (check audiobook_get_status's "alignment" field first).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description reinforces this with 'Does not change anything.' It adds further behavioral context by describing the re-scan behavior, the JSON return schema, and the error condition when the chapter hasn't been aligned yet. This goes well beyond what the annotations alone convey.

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 organized into purpose, args, returns, and error handling. Each section earns its place: the purpose is front-loaded, the parameter guidance is concise, the return schema is compact, and the error condition is actionable. There is no filler or repetition of annotation fields.

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 read-only inspection tool with nested parameters and an output schema, the description covers the full call context: when to use it, what it does, what parameters mean, what the return JSON looks like, and what error to expect. The agent has everything needed to invoke it correctly and interpret results.

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?

The schema coverage signal is 0%, so the description must carry parameter meaning. It lists all parameters and adds tuning guidance ('widen noise_db (e.g. -25) for a loud passage, shorten min_silence to catch briefer pauses') that goes beyond the schema's property descriptions. It does not restate every default or range, but the schema already supplies those, and the description adds practical semantics.

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-resource pair ('Re-scan the audio around a chapter's currently recorded boundary and list every silence gap found'), which clearly states what the tool does. It also differentiates itself from sibling tools by naming follow-up tools like audiobook_render_boundary_waveform and audiobook_patch_chapter_boundary, so an agent can distinguish it without opening other schemas.

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 when this tool is most useful: for chapters that showed up in fallback_chapters or word_count_warnings from audiobook_get_status. It also tells the agent what to check first (audiobook_get_status's alignment field) and what to do next, providing clear selection and sequencing guidance relative to siblings.

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

audiobook_inspect_epubPreview an EPUB's chapters and metadataA
Read-onlyIdempotent

Parse an EPUB and preview the book metadata, chapter list, and cover art the audiobook pipeline would use, WITHOUT touching any audio file or creating a conversion job. Use this before audiobook_start_conversion to sanity-check chapter detection (e.g. spot an EPUB with an unusual structure) or to answer questions like "how many chapters does this book have" without needing the MP3 yet.

Args: params (InspectEpubInput): - epub_path (str): Absolute path to the .epub file.

Returns: str: JSON with schema: { "title": str, "author": str, "series": str, "series_index": str, "year": str, "cover_found": bool, "chapter_count": int, "total_word_count": int, "first_chapters": [{"n": int, "title": str, "word_count": int}, ...], # up to 3 "last_chapters": [{"n": int, "title": str, "word_count": int}, ...] # up to 3 } or {"error": str, "error_type": str} on failure.

Error Handling: - "epub_extract_error" style errors if the file isn't a valid EPUB or no chapters could be located at all (e.g. no TOC and no spine items pass the front/back-matter filter).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Even with annotations declaring readOnlyHint, idempotentHint, and destructiveHint, the description adds concrete behavioral guarantees: no audio files are touched, no conversion job is created, and it documents both the exact JSON return shape and the 'epub_extract_error' style failure mode. This goes well beyond the annotations.

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 well-structured and front-loaded with purpose and usage context, followed by clear Args, Returns, and Error Handling sections. It is slightly long because the full return JSON schema is embedded even though an output schema exists, which costs it a point on conciseness.

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 single-parameter, read-only inspection tool, the description covers the purpose, when to use it, what it returns, and what errors to expect. The presence of an output schema further fills in return details, so nothing needed for correct invocation is missing.

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?

The description states that epub_path must be an absolute path to the .epub file, but this mostly repeats the input schema's property description, which already includes an example. With schema coverage listed at 0%, the description partially compensates by naming the requirement, but it adds no extra constraints such as file existence, valid EPUB requirement, or path format edge cases.

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: 'Parse an EPUB and preview the book metadata, chapter list, and cover art'. It also clearly differentiates this tool from conversion tools by stating it works 'WITHOUT touching any audio file or creating a conversion job', making its 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 explicitly says to use this tool before audiobook_start_conversion to sanity-check chapter detection, and to answer questions like chapter counts without needing an MP3. It does not explicitly contrast itself with audiobook_inspect_chapter_boundary, so it stops short of fully enumerating alternatives.

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

audiobook_list_conversionsList known conversion jobsA
Read-onlyIdempotent

List jobs known to this server (persisted at $AUDIOBOOK_MCP_HOME/registry.json, default ~/.audiobook_mcp/), most recently created first.

Args: params (ListConversionsInput): - out_dir (Optional[str]): if set, only jobs whose output directory matches exactly. - limit (int): max jobs to return (1-100, default 20). - offset (int): pagination offset (default 0).

Returns: str: JSON with schema: { "total": int, "count": int, "offset": int, "jobs": [ {"job_id": str, "mp3": str, "epub": str, "out_dir": str, "work_dir": str, "created_at": float} ], "has_more": bool, "next_offset": int | null }

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuine value on top: persistence path ($AUDIOBOOK_MCP_HOME/registry.json), most-recent-first ordering, and pagination semantics via has_more/next_offset in the return schema. No contradiction with annotations.

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?

Purpose is front-loaded, followed by a cleanly structured Args section and return schema. The return JSON block is verbose but earns its place by defining pagination fields. Some parameter detail overlaps with schema descriptions, but the overall structure is efficient and scannable.

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?

Complete for a read-only listing tool: purpose, persistence location, ordering, all parameters, and full return schema are covered, and annotations carry the safety profile. A minor gap is that it doesn't note the relationship between job_id in results and tools like get_status, but nothing essential to invoking it correctly is missing.

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?

Despite the context signal reporting 0% schema coverage, the description documents all three parameters (out_dir exact-match filter, limit 1-100 default 20, offset default 0), adding constraint ranges and defaults beyond the schema's per-property descriptions. The description fully compensates for the coverage signal, though it slightly duplicates what the schema already states.

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?

States a specific verb and resource ('List jobs known to this server') and names the persistence location and ordering (most recent first). This clearly distinguishes it from siblings like audiobook_get_status (single job), audiobook_start_conversion, and audiobook_cancel_conversion (mutations). An agent can tell it apart without opening other schemas.

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

Usage Guidelines3/5

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

The read-only enumeration purpose is implied, and the distinction from get_status (per-job check) is inferable but never stated. No explicit 'use this when...' guidance or named alternatives/exclusions appear. The ordering and persistence context help, but the tool does not tell the agent when to prefer it over its siblings.

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

audiobook_lookup_book_metadataLook up book/audiobook metadata and cover art candidatesA
Read-onlyIdempotent

Look up book/audiobook metadata (authors, narrators, publisher, publish date, description, ratings, ISBN, length) and candidate cover images across free, unauthenticated APIs: Google Books, Open Library, Audible's public catalog search, and Apple's iTunes Search. No scraping, login, or CAPTCHA surface is touched -- these are the same plain JSON endpoints each service's own search box calls.

Ported from the book-metadata-fetch skill; carries over its guardrails: personal research/cataloging use, not a bulk data feed -- this tool self-throttles slightly between calls, but don't loop it over long lists of titles. It has NO Amazon/Audible-retail-page fallback (that requires a browser tool this server doesn't have) -- if Tier 1 here comes up short, that's the tool's real ceiling; a calling agent with its own browser tool may attempt one manual, on-demand page visit per the source skill's Tier 2 procedure, subject to the same guardrails (never bypass a CAPTCHA/sign-in wall).

Series volumes are the main failure mode: search APIs rank by relevance, not series order, so an unfiltered query for "Defiance of the Fall" can return book 12. Include the volume number in title when known (e.g. "Defiance of the Fall 6").

Args: params (LookupBookMetadataInput): see field descriptions. Notably reconcile=True (default) merges all sources into one record; include_covers=True (default) probes each candidate cover's real pixel dimensions (never trust a CDN URL's size token).

Returns: str: JSON. With reconcile=True: { "record": { "title": str, "authors": [str,...], "narrators": [str,...], "description": str, "publisher": str, "published_date": str, "categories": [str,...], "average_rating": float, "ratings_count": int, "length": str, "isbn": str, "source_url": str, "_provenance": {field: source_name}, # which source supplied each field "_conflicts": [str, ...], # fields sources disagreed on -- READ THESE # before trusting publisher/published_date; # audiobook vs. print edition is the common case "_missing": [str, ...] # fields nothing supplied }, "errors": {source_name: error_message}, "covers": [ # present if include_covers=True {"source": str, "url": str, "width": int|null, "height": int|null, "bytes": int} | {"source": str, "url": str, "error": str} ] } With reconcile=False: {"raw": {source_name: [...]}, "errors": {...}, "covers": [...]}.

Error Handling: - Per-source failures land in "errors" rather than failing the whole call -- e.g. Google Books commonly 429s on its shared anonymous quota; the other three sources still return. - Only fails outright ({"error": ...}) if input validation fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

Annotations already declare readOnlyHint/idempotentHint/openWorldHint, and the description layers substantial extra behavior on top: no scraping/login/CAPTCHA surface, self-throttling between calls, per-source failures landing in 'errors' (Google 429 example), only failing outright on input validation, and cover probing that reports true decoded pixel dimensions. Nothing contradicts the annotations.

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 long but coherently sectioned (purpose, guardrails, failure mode, args, returns, errors) and front-loaded with the core purpose. Every section adds operational value, though the 'Args' bullet partially restates what the schema's $defs already describe, and the return-format block could arguably live in the output schema.

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 tool with four external sources, six parameters, two reconcile modes, and cover probing, the description is remarkably complete: it covers source enumeration, quota behavior, error semantics, the full JSON return shape for both reconcile modes, and the known failure mode (series volumes). 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?

With schema description coverage reported at 0%, the description carries the parameter-documentation burden and largely delivers: it explains reconcile=True merges sources, include_covers=True probes real pixel dimensions, and emphasizes including the volume number in title to defeat relevance-ranked series mismatches. It does not explicitly walk through author/source/google_api_key, though those are documented in the schema's own $defs, so the compensation is strong but not complete.

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 first sentence names a specific verb ('look up'), a specific resource (book/audiobook metadata and candidate cover images), and enumerates the four source APIs. This clearly distinguishes it from siblings like audiobook_fetch_cover_image (which fetches a concrete cover into a file rather than returning candidates) and the conversion/status/boundary tools.

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 gives explicit when/when-not guidance: personal research/cataloging use, 'not a bulk data feed', 'don't loop it over long lists of titles', and names the alternative path (a calling agent with its own browser tool may do one manual Tier 2 page visit). It also states the tool's real ceiling when Tier 1 comes up short, so an agent can decide whether to fall back.

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

audiobook_patch_chapter_boundaryManually override a chapter's detected boundaryA
Destructive

Manually fix a chapter boundary that landed in the wrong place (surfaced via fallback_chapters, low_confidence_chapters, or word_count_warnings). This overwrites the recorded boundary for chapter_index and invalidates every stage derived from it -- encoded segments, the assembled file, and delivery all get regenerated on the next audiobook_continue_conversion/audiobook_run_until_done call. Chapters before and after chapter_index are untouched, so this is always cheaper than restarting the whole job.

Args: params (PatchBoundaryInput): - job_id (str), chapter_index (int, 1-based). - new_start_seconds (float): the corrected boundary, typically the midpoint of a gap surfaced by audiobook_inspect_chapter_boundary.

Returns: str: JSON with schema: { "chapter_index": int, "old_start_seconds": float, "new_start_seconds": float, "invalidated": [str, ...], # state keys cleared, e.g. "segments", "encode_progress" "stage_now": str # call audiobook_continue_conversion next } or {"error": ...} if chapter_index hasn't been aligned yet or new_start_seconds is out of range.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

The description goes well beyond the destructiveHint annotation by specifying exactly what gets invalidated: encoded segments, the assembled file, and delivery, and that regeneration occurs on the next audiobook_continue_conversion or audiobook_run_until_done call. It also reassures that other chapters are unaffected and documents error conditions, providing a complete safety picture.

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 well-structured with distinct paragraphs for purpose, consequences, parameters, and return value. It is longer than necessary, but the length is justified by the destructive invalidation semantics and the need to clarify next steps. The key decision-relevant information is front-loaded.

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 description covers all essential context: trigger conditions, the destructive invalidation scope, how to obtain the corrected boundary, the exact return schema including the invalidated list and stage_now field, and what to call next. Given the tool's complexity and the presence of an output schema, no critical information is missing.

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?

Though schema coverage is reported as 0%, the description compensates by explaining each parameter in the Args block: job_id, 1-based chapter_index, and new_start_seconds as the corrected boundary typically derived from audiobook_inspect_chapter_boundary. This adds meaningful context beyond the raw schema, though it stops short of describing valid ranges or format details.

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 is explicit: it says 'Manually fix a chapter boundary that landed in the wrong place' and clarifies it 'overwrites the recorded boundary for chapter_index'. It also differentiates from sibling tools like audiobook_inspect_chapter_boundary and audiobook_render_boundary_waveform by focusing on the patching/override action rather than inspection or rendering.

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?

It states when to use the tool: when boundaries are surfaced via fallback_chapters, low_confidence_chapters, or word_count_warnings. It also provides an explicit workflow reference by noting the corrected boundary is typically the midpoint of a gap from audiobook_inspect_chapter_boundary, and explains that this is cheaper than restarting the job because adjacent chapters remain untouched.

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

audiobook_render_boundary_waveformRender a waveform image around a chapter boundaryA
Idempotent

Render a PNG waveform snapshot centered on a chapter's current recorded boundary (or on center_override_seconds, e.g. a candidate gap surfaced by audiobook_inspect_chapter_boundary). A clean cut shows an obvious gap centered in the image with speech clusters on both sides; if the gap looks off-center or absent, the boundary likely needs audiobook_patch_chapter_boundary.

Args: params (RenderWaveformInput): - job_id (str), chapter_index (int, 1-based). - half_window_seconds (float): half-width of the rendered window (default 8). - center_override_seconds (Optional[float]): render around this timestamp instead of the recorded boundary.

Returns: Image: a PNG waveform image.

Error Handling: - Raises a clear error if chapter_index hasn't been aligned yet and no center_override_seconds was given.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare idempotent and non-destructive behavior; the description adds useful behavioral details: output is a PNG image, rendering is centered on a boundary or override timestamp, and it raises an error when the chapter is not aligned and no override is provided. This is meaningful beyond the annotations, though it could say more about computational cost or why readOnlyHint is false.

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 well organized into overview, args, returns, and error handling. Every section adds operational value, including the brief heuristic for interpreting the rendered waveform. There is no redundant filler.

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 rendering tool without an output schema, the description provides the return type, error condition, and intended workflow with sibling tools. It could more deeply explain what 'chapter hasn't been aligned yet' means, but the references to audiobook_inspect_chapter_boundary and audiobook_patch_chapter_boundary provide enough context for an agent to act.

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% at the top level, so the description carries the parameter documentation. It lists all four parameters, explains 1-based chapter indexing, notes the default half-window, and clarifies that center_override_seconds is used for timestamps surfaced by audiobook_inspect_chapter_boundary. Ranges and constraints are left to the schema, but the description gives sufficient invocation semantics.

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?

States a specific verb and resource: render a PNG waveform snapshot centered on a chapter boundary. It also includes the interpretive purpose (checking whether a gap is centered) and distinguishes itself from related tools by describing the visual verification workflow.

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?

Explicitly provides when-to-use guidance: use the default recorded boundary, or use center_override_seconds when audiobook_inspect_chapter_boundary surfaces a candidate gap. It also tells the agent what to do if the gap looks off-center or absent: the boundary likely needs audiobook_patch_chapter_boundary.

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

audiobook_run_until_doneLoop a conversion job forward until it finishes or a time cap is hitA

Repeatedly advance a job in chunk_seconds increments, reporting progress, until either it finishes or max_total_seconds elapses -- whichever comes first. This is the convenient one-call way to drive a job; use audiobook_continue_conversion directly instead if you want fine-grained control over each chunk (e.g. to react to a warning partway through).

For a long book this may still return with "done": false if max_total_seconds wasn't enough -- just call it again with the same job_id to keep going; already-completed work is never redone.

Args: params (RunUntilDoneInput): - job_id (str): from audiobook_start_conversion. - chunk_seconds (float): size of each internal step (default 60). - max_total_seconds (float): overall cap for this call (default 1200s / 20 min).

Returns: str: JSON status object (same schema as audiobook_get_status) plus: - "elapsed_seconds" (float): how long this call actually ran. - "chunks_run" (int): how many internal chunks it took.

Error Handling: - Same as audiobook_continue_conversion. If a chunk raises partway through the loop, the loop stops immediately and the error is returned -- prior chunks in this call are already checkpointed.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Annotations only provide hints like readOnlyHint=false and idempotentHint=false. The description goes further by disclosing the chunked looping mechanism, stop conditions, checkpointing behavior, no-redo guarantee, and error-handling semantics. It adds substantial behavioral context beyond the annotations and does not contradict them.

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 detailed but every sentence earns its place: core behavior, usage guidance, parameter semantics, return value extension, and error handling are each covered in compact, well-organized sections. The most important behavioral facts are front-loaded.

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?

This is a stateful looping operation with non-trivial stopping conditions and error behavior. The description covers how to invoke it, what its bounds are, what the return value includes, how to resume, and how errors are handled. 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.

Parameters5/5

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

Despite the schema coverage being 0%, the description thoroughly explains each parameter: job_id's source, chunk_seconds as the internal step size, and max_total_seconds as the overall cap with a clear 'call again to keep going' semantic. This fully compensates for the lack of schema-level descriptions.

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 verb and resource: 'Repeatedly advance a job... until it finishes or max_total_seconds elapses.' It also explicitly distinguishes this tool from audiobook_continue_conversion, giving an agent a clear basis for selection without reading schemas.

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?

It explicitly states when to use this tool (convenient one-call driving) and when to prefer the alternative (fine-grained control via audiobook_continue_conversion). It also tells the agent what to do if the job isn't done: call again with the same job_id, since completed work is never redone.

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

audiobook_start_conversionStart (or resume) an audiobook -> M4B conversion jobA
Idempotent

Create a resumable conversion job for one MP3/M4A audiobook + its EPUB, and run the fast first stage (EPUB parsing + audio duration probe). This does NOT do the slow chapter-alignment/encoding work -- call audiobook_continue_conversion or audiobook_run_until_done next, and loop until the response's "done" field is true.

Calling this again with the exact same mp3_path/epub_path/out_dir resumes the existing job (returning its current status) instead of creating a duplicate, unless force_restart=True.

Args: params (StartConversionInput): see field descriptions. Notably: - mp3_path/epub_path (str): source files, must both exist. - out_dir (str): where the finished .m4b will be written. - cover_image_path (Optional[str]): use this image instead of the EPUB's own cover. Typical flow: audiobook_lookup_book_metadata -> audiobook_fetch_cover_image -> pass the downloaded path here. - verify_first_chapter (bool): on by default. Confirms chapter 1's actual start via whisper.cpp transcription before any other chapter is aligned, since every later chapter is chained forward from it -- an unconfirmed guess there (typically a missed intro) otherwise throws off the whole book. Falls back to the old silence-only heuristic and logs a warning if whisper.cpp isn't configured; never fails the job. - detect_intro/detect_outro (bool): off by default; only turn on if the user has confirmed the book has an audible intro/outro segment (see tool description in code for why). detect_intro only takes effect as verify_first_chapter's fallback -- see its own field description.

Returns: str: JSON with schema: { "job_id": str, # pass this to every other job tool "stage": str, # "align" once extract succeeds "book": {"title", "author", "series", "series_index", "chapter_count", "cover_found"}, "next_step": str # what to call next } or {"error": str, "error_type": str} on failure.

Error Handling: - "ffmpeg_missing" if ffmpeg/ffprobe aren't on PATH. - Otherwise a PipelineError/EpubExtractError with a specific reason (file not found, wrong extension, unparseable EPUB, ...).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

Annotations already mark idempotentHint=true and readOnlyHint=false, but the description adds substantial behavioral detail beyond that: it explains that re-calling with the same paths resumes instead of duplicating, that force_restart discards progress, that verify_first_chapter falls back to silence heuristics without failing, and that error responses include specific error types. This gives the agent an accurate model of side effects and failure modes.

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 long, but the tool is complex and the length is mostly justified. It is well-structured with clear Args, Returns, and Error Handling sections, and the core purpose and next-step guidance are front-loaded. Minor deductions for the slightly awkward 'see tool description in code' reference and some redundancy with the already-detailed schema field descriptions.

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 complexity of a multi-stage conversion pipeline, this description is complete: it specifies the exact output JSON shape, the required next actions, error types, resumption semantics, and the behavior of optional settings. An agent has enough context to invoke this tool correctly and decide what to do next.

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?

Although the top-level schema coverage is 0%, the description compensates by highlighting the most decision-critical parameters: mp3_path/epub_path must exist, cover_image_path should come from the cover-fetch flow, verify_first_chapter is on by default and explains why, and detect_intro/detect_outro are off by default due to false-positive risk. It does not walk through every parameter, but it directs readers to field descriptions and adds meaningful behavioral context for the important ones.

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 precise verb and resource: it creates/resumes a resumable conversion job for one MP3/M4A + EPUB, then runs only the fast first stage. It explicitly distinguishes itself from the slower alignment/encoding work by naming audiobook_continue_conversion and audiobook_run_until_done, so an agent can tell it apart from sibling tools immediately.

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 gives explicit next-step routing: call audiobook_continue_conversion or audiobook_run_until_done and loop until 'done' is true. It also explains resumption behavior and the cover-image workflow (audiobook_lookup_book_metadata -> audiobook_fetch_cover_image -> cover_image_path), giving concrete guidance on when and how to use the tool.

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

audiobook_transcribe_chapter_boundaryTranscribe the audio right after a chapter boundaryA
Idempotent

Transcribe a few seconds of audio starting at a chapter's current recorded boundary (or center_override_seconds, e.g. a candidate gap surfaced by audiobook_inspect_chapter_boundary) via a local whisper.cpp install -- a text-based alternative/complement to audiobook_render_boundary_waveform for judging a low_confidence or fallback boundary. Compare the transcript against expected_opening_text (pulled straight from the EPUB's own chapter text): a rough match means the cut is clean; a transcript that trails off from the PREVIOUS chapter's content means the boundary landed too late; one missing this chapter's first words means it landed too early.

Requires whisper.cpp (https://github.com/ggerganov/whisper.cpp) on PATH as whisper-cli or whisper-cpp (or AUDIOBOOK_MCP_WHISPER_BIN pointing at its CLI binary directly), plus a downloaded GGML model file referenced by AUDIOBOOK_MCP_WHISPER_MODEL -- no Python speech-recognition dependency. Missing either is reported clearly, not silently skipped.

Args: params (TranscribeBoundaryInput): - job_id (str), chapter_index (int, 1-based). - duration_seconds (float): how much audio to transcribe, starting at the boundary (default 12). - language (str): whisper.cpp language code (default "en") -- set to the book's actual spoken language. - center_override_seconds (Optional[float]): transcribe starting here instead of the recorded boundary.

Returns: str: JSON with schema: { "chapter_index": int, "start_seconds": float, "duration_seconds": float, "transcript": str, # "" if the clip is silent/inaudible "expected_opening_text": str | absent # first ~40 words of this chapter's # own EPUB text, if available } or {"error": str, "error_type": str} on failure.

Error Handling: - "dependency_missing" if ffmpeg or whisper.cpp (binary or model) aren't available -- see the tool description for setup. - Raises a clear error if chapter_index hasn't been aligned yet and no center_override_seconds was given.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (idempotentHint, destructiveHint), the description discloses important runtime behavior: dependency requirements, the fact that missing dependencies are 'reported clearly, not silently skipped,' specific error types, and conditions that raise errors (un-aligned chapter without center_override_seconds). This adds substantial information an agent needs.

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 long but well-organized into paragraphs covering purpose, dependencies, parameters, return format, and error handling. It is front-loaded with the core purpose and each section earns its place. It could be slightly tighter, but the structure supports quick comprehension.

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 description covers all important operational aspects: what it does, when to use it, dependencies, parameter semantics, return shape, error handling, and interpretation of results. Even with an output schema, the description adds interpretation guidance and prerequisite setup, leaving no critical gap.

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?

Although the schema already contains parameter descriptions, the tool description adds actionable meaning: center_override_seconds is tied to 'a candidate gap surfaced by audiobook_inspect_chapter_boundary', language is clarified as the book's 'actual spoken language', and expected_opening_text is explained as coming from the EPUB's own chapter text. This goes beyond a bare list of parameter names.

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 verb and resource ('Transcribe a few seconds of audio starting at a chapter's current recorded boundary... via a local whisper.cpp install') and explicitly distinguishes it from a sibling ('a text-based alternative/complement to audiobook_render_boundary_waveform'). An agent can tell exactly what this tool does and how it differs.

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 when to use it ('for judging a low_confidence or fallback boundary'), names the sibling alternative (audiobook_render_boundary_waveform), and explains how the transcript should be interpreted. It does not explicitly state 'when not to use' cases, but the usage context is unambiguous.

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

audiobook_verify_outputSanity-check a finished M4BA
Read-onlyIdempotent

Run the same checks the skill recommends before handing a result back: chapter count, total duration (optionally cross-checked against the original source file), first/last chapter titles, and whether a cover-art video stream is present.

Args: params (VerifyOutputInput): - m4b_path (str): the file to verify. - source_audio_path (Optional[str]): original mp3/m4a, for a duration cross-check. - expected_chapter_count (Optional[int]): compare against this.

Returns: str: JSON with schema: { "duration_seconds": float, "chapter_count": int, "first_chapter_title": str, "last_chapter_title": str, "has_cover_art": bool, "source_duration_seconds": float | absent, "duration_difference_seconds": float | absent, "issues": [str, ...] # empty list means everything checked out } or {"error": ...} if m4b_path can't be probed by ffprobe.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive behavior. The description adds useful behavioral detail: it runs ffprobe-based checks, optionally cross-checks source duration, and returns an error object when the file cannot be probed. This goes beyond the annotations without contradicting them.

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 front-loaded with purpose, then cleanly structured into Args and Returns sections. The inline return JSON is somewhat redundant given an output schema exists, but the overall structure is easy to parse and each section serves a clear navigational role.

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 verification tool with strong annotations and an output schema, this is complete: it explains what is checked, the role of each parameter, the return shape, and the error behavior. An agent has everything needed to call and interpret this tool 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?

Although the context signal reports 0% schema description coverage, the description itself documents all three parameters with meaningful explanations: m4b_path is the file to verify, source_audio_path enables duration cross-checking, and expected_chapter_count is the comparison target. This compensates well for the reported coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'sanity-check a finished M4B' and lists the exact checks performed (chapter count, duration, titles, cover art). It clearly conveys verification/QA rather than status or conversion, though it does not explicitly name or differentiate sibling tools.

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 says to run this 'before handing a result back', giving a clear temporal and workflow context for when to call it. It does not name alternatives or state when not to use it, but the purpose is specific enough that usage is well implied.

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. 15 tool updatesv0.1.0
    • First observedaudiobook_cancel_conversion
    • First observedaudiobook_continue_conversion
    • First observedaudiobook_embed_cover_metadata
    • First observedaudiobook_fetch_cover_image
    • First observedaudiobook_get_status
    • First observedaudiobook_inspect_chapter_boundary
    • First observedaudiobook_inspect_epub
    • First observedaudiobook_list_conversions
    • First observedaudiobook_lookup_book_metadata
    • First observedaudiobook_patch_chapter_boundary
    • First observedaudiobook_render_boundary_waveform
    • First observedaudiobook_run_until_done
    • First observedaudiobook_start_conversion
    • First observedaudiobook_transcribe_chapter_boundary
    • First observedaudiobook_verify_output

TDQS

A4.6/5.0

Scored across 15 tools

Disambiguation5/5

Each tool targets a distinct operation: job lifecycle, status, boundary inspection/correction, output verification, and metadata handling are all clearly separated. Even similar tools like continue_conversion and run_until_done are explicitly differentiated by chunked vs. looping behavior.

Naming Consistency5/5

All tools use the consistent audiobook_ prefix followed by verb_noun snake_case names (start_conversion, get_status, patch_chapter_boundary). This makes the intended action and target resource predictable across the entire toolset.

Tool Count5/5

At 15 tools, the server is at the upper end of a well-scoped set, but every tool serves a distinct and necessary purpose in the audiobook pipeline. The count feels appropriate for covering conversion, progress tracking, boundary QA, verification, and metadata enrichment without redundant clutter.

Completeness5/5

The toolset provides a complete workflow: inspect EPUB, start/resume/run/cancel jobs, monitor progress, verify output, handle boundary corrections, and fetch/embed cover metadata. There are no obvious dead ends or missing lifecycle operations for the stated audiobook conversion purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    F
    maintenance
    Hosted Streamable HTTP MCP server (https://epublys.com/mcp) with 9 tools for EPUB/PDF manipulation: merge, split, compress, EPUB↔PDF conversion, metadata read/edit, validation with auto-fix, and AI cover generation. Free API key, no install. Listed on the official MCP registry as com.epublys/epublys.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Transcribes audio/video files, generates summaries and structured knowledge items, and supports Notion integration and chat-based interaction. Works as a standalone CLI, Notion integration, or MCP server tool for agent ecosystems.
    7 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables chat-driven audio analysis and enhancement using local Claude, including denoising, EQ, compression, and loudness normalization, with an A/B viewer for synchronized comparison.
    1
    MIT