cwmcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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