cwmcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_booksA | List all books in the content directory with their publication IDs. |
| chapter_statusA | Get the status of all lang/level combos for a chapter. Reports which files exist locally (chapter.md, audio, marks, translations). Args: book: Book directory name (e.g. "1984", "everyday-life") chapter_number: Chapter number (e.g. 7) |
| create_chapter_from_marksA | Create one chapter variant (single language+level) via cwbe's
Returns JSON with If a chapter with the same (publication, language, level, title) already exists, cwbe returns that chapter's UUID immediately — safe to retry. Args:
publication_id: Publication UUID on cwbe.
title: Localized chapter title (e.g. "0005 - Les plans").
language: Source language code (EN | FR | ES | DE | IT | PT | ZH | JA | KO).
level: Difficulty (B1 | B2).
marks: Pre-split sentence list in the source language. No blanks.
source_audio_blob_name: Optional retry hint — skip phase 0 (TTS) by
reusing a cached audio bundle from a previous failed run. Scrape
from cwbe logs after a failure.
tokens_per_mark: Pre-segmented source tokens, one list per mark
(parallel to |
| validate_marksA | Dry-run a
Use this BEFORE every Returns the cwbe Issue
Args:
language: Source language code (EN | FR | ES | DE | IT | PT | ZH | JA | KO).
level: B1 | B2.
marks: Pre-split sentence list in the source language. No blanks.
tokens_per_mark: Optional pre-segmented source tokens, one list per
mark. Validate is permissive (it's the exploratory step) — pass
them once you have agent glosses ready so validate sees what
/from-marks will see. Omit on a first pass to inspect cwseg's
tokens via /segment instead.
token_glosses: Same shape as on |
| lint_marksA | Pre-submission linter for source mark texts. ZERO API calls — runs locally in milliseconds. Catches issues that historically tripped the pipeline before you waste a Gemini call on them. Checks per mark:
Returns: {summary: {markCount, warningCount, errorCount, verdict}, marks: [...]} verdict: "ok" | "watch" (warnings only) | "blocked" (errors present) Run this BEFORE create_chapter_from_marks. If verdict is "blocked", fix the source text. If "watch", spot-check the flagged marks after upload. Args: source_language: Language of the marks (EN/FR/ES/DE/IT/PT/ZH/JA/KO). marks: List of source-language sentences. Same input you'd pass to create_chapter_from_marks. |
| regloss_chapter_tokensA | Re-run Gemini per-token glossing on a CJK-source chapter using the
current Use after a Gemini prompt fix to refresh EU glosses on chapters glossed
under the older prompt. To fix bad Asian glosses on an existing
chapter, recreate it via Returns Args: publication_id: Publication UUID. chapter_id: Chapter UUID. |
| clear_gemini_cacheA | Wipe cwbe's Gemini sentence + token caches. Use sparingly — primary cases are recovery from a poisoned cache state or forcing a cold-cache re-run for testing. Normal day-to-day work should never need this. Schema in Swagger → |
| gemini_cache_statsA | Caffeine stats (hit rate, size, evictions) for cwbe's Gemini sentence
and token caches. Useful for debugging unexpected validate/ingest costs
or confirming cache key parity between validate and Schema in Swagger → |
| generate_audioA | Break-glass: call cwtts directly to generate audio for a single
lang/level. Returns base64 MP3 + per-mark UUIDs + millisecond timings.
Normal chapter creation should go through Args: language: Source language code (EN | FR | ES | DE | IT | PT | ZH | JA | KO). marks: Pre-split sentence list in that language. |
| translate_textsB | Break-glass: translate a list of texts from one source language to
all 8 other langs via Gemini. Returns |
| segmentA | Tokenise a list of marks via cwseg (jieba/fugashi/kiwipiepy for CJK, regex for EU). Always batch every mark in ONE call — per-mark calls flake under rate limits. Returns Args: language: Source language code (EN | FR | ES | DE | IT | PT | ZH | JA | KO). marks: List of mark texts. All in the same language. |
| alignA | Break-glass: call awesome-align for EU↔EU token-alignment between
one source sentence and its per-target translations. Args:
source_language: Source lang code (must be EU: EN/FR/ES/DE/IT/PT).
source_text: Source sentence.
targets: |
| gloss_tokensA | Break-glass: ask Gemini for per-token offline glosses into EU targets
only (EN/FR/ES/DE/IT/PT). Returns a list of Args:
source_language: Source lang code (typically CJK: ZH / JA / KO).
sentence_text: The source sentence containing the tokens.
sentence_translations: Sentence-level translations, e.g.
|
| upload_chapter_from_zipA | Break-glass: POST (or PUT if Args:
publication_id: Publication UUID.
audio_path: Absolute path to |
| download_chaptersB | Download all chapters for a publication to a local directory. Args: publication_id: Publication UUID from cwbe output_dir: Local directory to save files to |
| list_publicationsA | List all publications from cwbe with their IDs, titles, and types. |
| list_uploaded_chaptersC | List all chapters uploaded to cwbe for a publication. Args: publication_id: Publication UUID |
| get_publication_readmeC | Get the readme for a publication from cwbe. Args: publication_id: Publication UUID |
| update_publication_readmeB | Replace a publication's readme markdown. Partial update — all other fields (title, headers, descriptions, flags) are preserved. |
| update_publication_titlesA | Partial update of the publication title and/or per-language headers
and descriptions. |
| update_publication_flagsB | Partial update of the publication isComplete / archived flags. |
| create_publicationA | Create a new publication on cwbe. All 9 langs are required in both
Args: title: Canonical title (e.g. "The Iliad"). publication_type: "ONETIME_UPLOAD" | "CONTINUOUS_UPLOADS". copyright_terms: List of terms (e.g. ["PUBLICATION_PLUS_95", "LIFE_PLUS_70", "UNKNOWN", "LIFE_PLUS_100"]). headers: Per-lang display title, ALL 9 langs required. descriptions: Per-lang summary, ALL 9 langs required. readme: Authoring README markdown (style guide, glossary, etc.). cover_path: Absolute path to cover JPEG. archived: Default False. is_complete: Default False. |
| delete_publicationA | Delete a publication and EVERY chapter + blob it owns. Irreversible.
Requires explicit |
| delete_chapterA | Delete a single chapter variant and its blob. Irreversible.
Requires explicit |
| update_chapter_metadataA | Update chapter metadata (title, language, level) without re-uploading audio. Args: publication_id: Publication UUID chapter_id: Chapter UUID title: New chapter title language: Language code (e.g. "EN", "FR", "JA") level: "B1" or "B2" |
| chapter_release_sanity_checkA | Verify a chapter release — all 18 variants (9 langs × 2 levels) of one story chapter. Run this after every chapter release as the final sign-off before declaring the chapter done. Downloads each variant zip and checks structural integrity:
Args:
publication_id: Publication UUID.
title_prefix: Title prefix that matches all 18 variants of the
story chapter (e.g. "0005 - " for Iliad ch5). Variants are
matched by Returns the report shape (top-level This check is structural only — it does not verify the audio
language matches the chapter language (use Whisper |
| query_logsA | Query Grafana Loki for cwbe logs. Primary use: scrape
Exactly one of Args: job_id: Filter to lines containing this cwbe job UUID. filter_text: Filter to lines containing this literal substring (e.g. "from-marks", "blob=", "Google Translate raw response"). logql: Raw LogQL string, used verbatim. Caller handles escaping. minutes_back: Time window in minutes (default 30). limit: Max lines returned (default 500, newest-first). Returns JSON |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/paulmichaelstafford/cwmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server