MCP tool reference

Every tool exposed by the Anthra MCP server, grouped by the scope it requires. The schemas are JSON Schema, exactly as the MCP client sees them on tools/list.

books:read

  • list_books

    List every book in this account (newest first). Returns id, title, status, visibility, slug.

    Input schema
    {
      "type": "object",
      "properties": {}
    }
  • get_book

    Fetch a single book with its full chapter list (titles, summaries, content, word counts, audio URLs).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string",
          "description": "Book UUID."
        }
      },
      "required": [
        "bookId"
      ]
    }
  • get_chapter

    Fetch a single chapter (full prose content included).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • get_plan

    Read the book's planning surface — theme statement, reader promise, comp authors, selected beat sheet, POV/tense locks, auto-detected genre + audience confidences, and era-research citations.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_beat_sheets

    List every beat-sheet template (Save the Cat, Three-Act, Hero's Journey, Freytag, Kishotenketsu, Tell/Promise/Mean) with each beat's label, intent, and position.

    Input schema
    {
      "type": "object",
      "properties": {}
    }
  • list_characters

    List the book's characters with the Truby-style want/fear/lie axes, POV flag, voice profile, and aliases.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_character_conflicts

    List the inter-character conflict matrix. Each row is 'from <kind> to' — e.g. 'Marin blocks Alex'.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_premise_pitches

    List the most recent round of premise pitches.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_outline_variants

    List the most recent round of outline variants (#14).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_outline_snapshots

    List every captured outline mutation (#22) — pair with restore_outline_snapshot.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_mood_references

    List tone / mood reference photos (#12) for this book.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_book_documents

    List writer's-bible documents (characters, plot_outline, theme_outline, style_guide, style_references, worldbuilding, research_notes, glossary, synopsis, lore, setting_bible, era_research).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • read_book_document

    Read the full content of one writer's-bible document.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "enum": [
            "characters",
            "plot_outline",
            "theme_outline",
            "style_guide",
            "style_references",
            "worldbuilding",
            "research_notes",
            "glossary",
            "synopsis",
            "lore",
            "setting_bible",
            "era_research"
          ]
        }
      },
      "required": [
        "bookId",
        "kind"
      ]
    }
  • list_book_document_revisions

    List saved snapshots of one writer's-bible document (newest first).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "enum": [
            "characters",
            "plot_outline",
            "theme_outline",
            "style_guide",
            "style_references",
            "worldbuilding",
            "research_notes",
            "glossary",
            "synopsis",
            "lore",
            "setting_bible",
            "era_research"
          ]
        }
      },
      "required": [
        "bookId",
        "kind"
      ]
    }
  • lint_prose

    Static prose linter across one or all chapters — zero LLM cost. Flags adverbs, passive voice, cliches, AI fingerprints, forbidden-word hits, etc. Returns per-chapter severity (green/yellow/red).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • find_repetition

    Detect overused phrases within a chapter, or repeated sentence openers across the book.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        },
        "scope": {
          "type": "string",
          "enum": [
            "chapter",
            "openers"
          ]
        }
      },
      "required": [
        "bookId"
      ]
    }
  • spoken_readability

    Score narration difficulty per chapter (consonant clusters, sibilants, breath length, proper nouns).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • style_drift

    Measure each written chapter's voice fingerprint against the book-wide average. High drift = a chapter is out of voice.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_forbidden_words

    Read the per-book forbidden-word list.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_chapter_revisions

    List saved snapshots of a chapter (newest first).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • list_collaborators

    List collaborators on a book.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_voices

    List the available ElevenLabs narration voices (id, name, accent, gender, age, preview URL). Use the voice id when configuring narration. Requires ELEVENLABS_API_KEY on the server.

    Input schema
    {
      "type": "object",
      "properties": {}
    }
  • list_chapters

    List every chapter on a book (id, order, title, summary, word count, audio status, image URL). Dedicated chapter list — pair with `get_chapter` to fetch full prose.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • export_book_markdown

    Export a fully written book as a single Markdown file, uploaded to Vercel Blob; returns a public download URL.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_print_products

    List every Lulu print-on-demand product available on this instance (key, label, trim, cover finish, page-count bounds). Use the key with `get_print_estimate`.

    Input schema
    {
      "type": "object",
      "properties": {}
    }

books:write

  • create_book

    Create a draft book from a one-line premise. Returns the book id, which subsequent generation tools accept. After creating, call `generate_outline`.

    Input schema
    {
      "type": "object",
      "properties": {
        "premise": {
          "type": "string",
          "minLength": 10,
          "description": "One-paragraph book idea (10–4000 chars)."
        },
        "title": {
          "type": "string",
          "maxLength": 200
        },
        "genre": {
          "type": "string",
          "maxLength": 120
        },
        "modelTier": {
          "type": "string",
          "enum": [
            "haiku",
            "sonnet",
            "opus"
          ],
          "description": "Writer model tier: haiku=fast draft, sonnet=default, opus=editorial."
        }
      },
      "required": [
        "premise"
      ]
    }
  • update_book

    Patch a book's metadata (title, subtitle, description, author, cover color, genre, tone). Does not touch chapters.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "subtitle": {
          "type": "string"
        },
        "author": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "coverColor": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$"
        },
        "genre": {
          "type": "string"
        },
        "audience": {
          "type": "string"
        },
        "toneStyle": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • delete_book

    Soft-delete a book. Recoverable within 30 days, after which the cron worker hard-deletes it.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • set_plan

    Write the planning surface fields. Any omitted field is left alone; pass null to clear. Fields: themeStatement, readerPromise, compAuthors, beatSheetTemplate (id like 'save-the-cat'), povLock, tenseLock ('past'|'present'), povDepth (0-100).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "themeStatement": {
          "type": [
            "string",
            "null"
          ]
        },
        "readerPromise": {
          "type": [
            "string",
            "null"
          ]
        },
        "compAuthors": {
          "type": [
            "string",
            "null"
          ]
        },
        "beatSheetTemplate": {
          "type": [
            "string",
            "null"
          ]
        },
        "povLock": {
          "type": [
            "string",
            "null"
          ]
        },
        "tenseLock": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "past",
            "present",
            null
          ]
        },
        "povDepth": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "maximum": 100
        }
      },
      "required": [
        "bookId"
      ]
    }
  • create_character

    Create a character row with name + optional want/fear/lie planning axes, voice profile, bio, role, aliases, and POV flag.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "aliases": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "role": {
          "type": [
            "string",
            "null"
          ]
        },
        "bio": {
          "type": [
            "string",
            "null"
          ]
        },
        "voiceProfile": {
          "type": [
            "string",
            "null"
          ]
        },
        "want": {
          "type": [
            "string",
            "null"
          ]
        },
        "fear": {
          "type": [
            "string",
            "null"
          ]
        },
        "lie": {
          "type": [
            "string",
            "null"
          ]
        },
        "isPov": {
          "type": "boolean"
        }
      },
      "required": [
        "bookId",
        "name"
      ]
    }
  • update_character

    Patch a character. Pass any subset of fields. Set want/fear/lie to null to clear those axes.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "characterId": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "aliases": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "role": {
          "type": [
            "string",
            "null"
          ]
        },
        "bio": {
          "type": [
            "string",
            "null"
          ]
        },
        "voiceProfile": {
          "type": [
            "string",
            "null"
          ]
        },
        "want": {
          "type": [
            "string",
            "null"
          ]
        },
        "fear": {
          "type": [
            "string",
            "null"
          ]
        },
        "lie": {
          "type": [
            "string",
            "null"
          ]
        },
        "isPov": {
          "type": "boolean"
        }
      },
      "required": [
        "bookId",
        "characterId"
      ]
    }
  • delete_character

    Remove a character row. Conflict edges cascade.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "characterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "characterId"
      ]
    }
  • add_character_conflict

    Add a conflict edge. Kind: blocks, rivals, loves, fears, manipulates, protects, betrays, other.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "fromCharacterId": {
          "type": "string"
        },
        "toCharacterId": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "enum": [
            "blocks",
            "rivals",
            "loves",
            "fears",
            "manipulates",
            "protects",
            "betrays",
            "other"
          ]
        },
        "description": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "bookId",
        "fromCharacterId",
        "toCharacterId",
        "kind"
      ]
    }
  • remove_character_conflict

    Remove one conflict edge.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "conflictId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "conflictId"
      ]
    }
  • select_premise_pitch

    Lock one premise pitch (writes book.premise).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "angle": {
          "type": "string",
          "enum": [
            "A",
            "B",
            "C"
          ]
        }
      },
      "required": [
        "bookId",
        "angle"
      ]
    }
  • apply_outline_variant

    Apply one outline variant to the chapter table (snapshots first, skips locked chapters).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "variantId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "variantId"
      ]
    }
  • restore_outline_snapshot

    Revert the outline to a saved snapshot in place.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "snapshotId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "snapshotId"
      ]
    }
  • write_book_document

    Create or overwrite one writer's-bible document. The current revision is snapshotted first so the change is recoverable.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "enum": [
            "characters",
            "plot_outline",
            "theme_outline",
            "style_guide",
            "style_references",
            "worldbuilding",
            "research_notes",
            "glossary",
            "synopsis",
            "lore",
            "setting_bible",
            "era_research"
          ]
        },
        "title": {
          "type": "string"
        },
        "content": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "kind",
        "content"
      ]
    }
  • restore_book_document_revision

    Roll a writer's-bible document back to a saved snapshot. The current content is snapshotted first so the restore is itself undoable.

    Input schema
    {
      "type": "object",
      "properties": {
        "revisionId": {
          "type": "string"
        }
      },
      "required": [
        "revisionId"
      ]
    }
  • set_forbidden_words

    Set or clear the per-book forbidden-word list. The linter flags hits and the writer prompt avoids them.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "words": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "bookId",
        "words"
      ]
    }
  • dismiss_sensitivity_flag

    Mark one sensitivity flag as dismissed.

    Input schema
    {
      "type": "object",
      "properties": {
        "flagId": {
          "type": "string"
        }
      },
      "required": [
        "flagId"
      ]
    }
  • set_chapter_meta

    Update a chapter's title, summary, or target word count without touching the prose.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "summary": {
          "type": [
            "string",
            "null"
          ]
        },
        "targetWords": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • reorder_chapters

    Atomically reorder chapters. orderedIds must list every chapter id in the new order.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "orderedIds": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "bookId",
        "orderedIds"
      ]
    }
  • restore_chapter_revision

    Roll a chapter back to a saved snapshot. The current content is snapshotted first.

    Input schema
    {
      "type": "object",
      "properties": {
        "revisionId": {
          "type": "string"
        }
      },
      "required": [
        "revisionId"
      ]
    }
  • invite_collaborator

    Invite a collaborator by email. Role: 'reader' (comments only) or 'editor' (edit access).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "role": {
          "type": "string",
          "enum": [
            "reader",
            "editor"
          ]
        }
      },
      "required": [
        "bookId",
        "email",
        "role"
      ]
    }
  • remove_collaborator

    Remove a collaborator from a book.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "email": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "email"
      ]
    }
  • update_chapter

    Overwrite a chapter's prose (and optionally its title/summary/notes). Snapshots the prior content so the change is recoverable, resets audio status if the content changed.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        },
        "title": {
          "type": "string",
          "maxLength": 300
        },
        "summary": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 1000
        },
        "content": {
          "type": "string",
          "maxLength": 100000
        },
        "notes": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 4000
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • split_chapter

    Split a chapter into two. Inserts a new (empty) chapter immediately after the original; later chapters' order numbers shift up by 1.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        },
        "newTitle": {
          "type": "string",
          "minLength": 1
        },
        "newSummary": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "bookId",
        "chapterId",
        "newTitle"
      ]
    }
  • merge_chapters

    Merge two adjacent chapters into one. The second chapter is removed; its content is appended to the first with a blank line separator. Snapshots both halves first so it's reversible.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "firstChapterId": {
          "type": "string"
        },
        "secondChapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "firstChapterId",
        "secondChapterId"
      ]
    }
  • cancel_generation

    Cancel the active book-generation workflow run for one book (the long-running outline-and-write pipeline). Idempotent — succeeds with ok:true even when no run is active. Reverts book status to `draft`.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }

generation:run

  • generate_outline

    Run the outliner: replaces any existing chapters with a fresh outline, sets title/subtitle/description/coverColor on the book, and advances status to `writing`. Synchronous — may take 10–60s.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "research": {
          "type": "boolean",
          "description": "Force-enable the Perplexity research pass before outlining. Defaults to the account-wide flag."
        }
      },
      "required": [
        "bookId"
      ]
    }
  • write_chapter

    Generate prose for one chapter and persist it. Returns the new content. Streaming is not exposed over MCP — this call resolves when the chapter is fully written and saved. Call chapters in `order` so the writer has continuity.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • rewrite_chapter

    Apply a directive to revise one chapter (e.g., "punch up the dialogue", "shorten by 30%"). Snapshots the prior text so the change is recoverable, then overwrites the chapter and invalidates audio.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        },
        "directive": {
          "type": "string",
          "minLength": 3,
          "description": "Editorial instructions for the rewrite."
        }
      },
      "required": [
        "bookId",
        "chapterId",
        "directive"
      ]
    }
  • narrate_chapter

    Synthesize ElevenLabs narration for a chapter and upload the MP3 to Vercel Blob. Returns the audio URL. Requires ELEVENLABS_API_KEY + BLOB_READ_WRITE_TOKEN on the server.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • premise_interview

    Premise-sharpening interview. action='read' returns saved state; 'generate' produces 3-5 questions; 'save' merges answers (q1, q2, …); 'apply' rewrites book.premise from answers.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "action": {
          "type": "string",
          "enum": [
            "read",
            "generate",
            "save",
            "apply"
          ]
        },
        "answers": {
          "type": "object"
        }
      },
      "required": [
        "bookId",
        "action"
      ]
    }
  • generate_premise_pitches

    Three competing premise pitches (A/B/C angles for the same idea). Use select_premise_pitch to lock one.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • detect_genre

    Auto-detect genre + audience from the current premise. apply:true writes the result to the book.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "apply": {
          "type": "boolean"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • research_era

    Era / period research with citation links. Writes a Markdown brief into the era_research writer's-bible document and saves the citations to book.researchCitations.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "eraHint": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "bookId"
      ]
    }
  • grade_outline

    Score the current outline 0-100 across arc / pacing / stakes / characters / ending, with a paragraph-level critique and 2-8 fix suggestions. force:true regrades even if cached.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "force": {
          "type": "boolean"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • generate_outline_variants

    Three competing outline variants (each with a one-line angle + a full chapter list). Costs three outline-LLM calls.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • draft_book_document

    Auto-draft one writer's-bible document from the premise + chapters. If a document already exists for that kind, pass confirm:true to overwrite it.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "enum": [
            "characters",
            "plot_outline",
            "theme_outline",
            "style_guide",
            "style_references",
            "worldbuilding",
            "research_notes",
            "glossary",
            "synopsis",
            "lore",
            "setting_bible",
            "era_research"
          ]
        },
        "confirm": {
          "type": "boolean"
        },
        "hint": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "bookId",
        "kind"
      ]
    }
  • critique_chapter

    LLM editorial pass on one written chapter — pacing, voice, continuity, line-level diagnostics. Read-only.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • check_continuity

    Run a continuity check across the whole book. Flags cross-chapter inconsistencies (names, dates, prop placement, motivation).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • suggest_cliche_replacements

    Find clichés in one chapter and propose specific replacements via the LLM.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • run_sensitivity_scan

    Scan one or all written chapters for sensitive content (race, gender, religion, disability, violence, …) and persist flags.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • choose_cover_color

    Pick a tasteful cover background color (6-digit hex) for a book based on its mood, genre, and tone, and save it. Cheap LLM call.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "mood": {
          "type": "string",
          "description": "Optional mood hint (e.g. \"stormy\", \"warm and hopeful\")."
        }
      },
      "required": [
        "bookId"
      ]
    }
  • generate_chapter_image

    Generate an illustration for one chapter via the AI Gateway image pipeline, store it in Vercel Blob, and set it as the chapter's lead image. PAID — charges one illustration credit; refunds on failure.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "chapterId": {
          "type": "string"
        },
        "styleHint": {
          "type": "string",
          "description": "Art-direction hint (e.g. \"muted watercolor\")."
        },
        "prompt": {
          "type": "string",
          "description": "Override the distilled prompt."
        }
      },
      "required": [
        "bookId",
        "chapterId"
      ]
    }
  • generate_cover_art

    Generate one or more cover-art variants via the AI Gateway image pipeline, store in Vercel Blob, and set the first as the book's active cover. PAID — charges per variant (1-3); refunds the unspent portion on partial failure.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "styleHint": {
          "type": "string",
          "description": "Art-direction (e.g. \"moody oil painting\")."
        },
        "prompt": {
          "type": "string",
          "description": "Hand-crafted prompt override."
        },
        "variants": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3
        }
      },
      "required": [
        "bookId"
      ]
    }
  • generate_back_cover

    Generate a back-cover panel via the AI Gateway image pipeline. Uses the marketing blurb when present, otherwise the premise. PAID — one illustration credit.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "prompt": {
          "type": "string"
        },
        "styleHint": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • generate_spine

    Generate a spine panel via the AI Gateway image pipeline. Narrow aspect ratio sized for paperback spines. PAID — one illustration credit.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "prompt": {
          "type": "string"
        },
        "styleHint": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • compose_cover_spread

    Compose the existing front cover, spine, and back cover into one print-ready wraparound spread (PNG). Uploads to Vercel Blob and records as a `cover_spread` image. Requires all three panels to exist already (run `generate_cover_art`, `generate_back_cover`, `generate_spine` first).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • narrate_book

    Synthesize narration for every written, un-narrated chapter on a book. Runs serially per chapter (long — minutes per chapter). PAID — ElevenLabs charges per chapter.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "overwriteExisting": {
          "type": "boolean",
          "description": "Re-narrate chapters that already have audio (default false)."
        }
      },
      "required": [
        "bookId"
      ]
    }
  • translate_book

    Create a new book that is a translation of an existing one into the target language (BCP-47 like "fr", "es", "pt-BR"). Clones metadata, seeds chapter shells, then translates each written chapter. EXPENSIVE — N LLM calls. Returns the new bookId.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "targetLanguage": {
          "type": "string",
          "minLength": 2
        },
        "sourceLanguage": {
          "type": "string"
        },
        "glossary": {
          "type": "string",
          "description": "Optional Markdown list of canonical translations for proper names / specialty terms."
        }
      },
      "required": [
        "bookId",
        "targetLanguage"
      ]
    }
  • produce_book

    Render a fully written book to EPUB / DOCX (synchronous — bytes returned via blob URL) or PDF (async — dispatches a workflow job, returns jobId; poll with `get_production_job_status`).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "format": {
          "type": "string",
          "enum": [
            "epub",
            "docx",
            "pdf"
          ]
        }
      },
      "required": [
        "bookId",
        "format"
      ]
    }
  • preview_voice_sample

    Synthesize a short (~30s) ElevenLabs sample using the opening paragraph of chapter 1 so the caller can hear the voice before committing to whole-book narration. PAID but cheap.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • export_audiobook

    Concatenate every ready-state chapter MP3 into a single M4B audiobook with embedded chapter markers, ambience, and intro/outro stings (if configured on the book). Requires every chapter to be narrated first. Uploads to Vercel Blob and returns the URL.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }

publish:write

  • publish_book

    Publish a book at /read/{slug}. Every chapter must have content. Returns the public reader URL.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "visibility": {
          "type": "string",
          "enum": [
            "private",
            "unlisted",
            "public"
          ],
          "description": "Defaults to the book's current visibility."
        }
      },
      "required": [
        "bookId"
      ]
    }
  • unpublish_book

    Revert a published book to status `ready`. Reader page stops resolving.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }

account:read

  • get_usage

    Lifetime + 30-day rollups of LLM token usage across this account, grouped by call kind (outline, chapter, rewrite, …).

    Input schema
    {
      "type": "object",
      "properties": {}
    }
  • list_author_preferences

    Read the author's saved preferences (POV, em-dash usage, voice prefs, etc.) — applied across every book.

    Input schema
    {
      "type": "object",
      "properties": {}
    }
  • set_author_preference

    Save a durable author preference (applied across every book).

    Input schema
    {
      "type": "object",
      "properties": {
        "key": {
          "type": "string"
        },
        "value": {
          "type": "string"
        }
      },
      "required": [
        "key",
        "value"
      ]
    }
  • get_credit_balance

    Read the account's current credit balance (number of generation credits remaining). One illustration is one credit; chapter writes and narration draw multiple credits depending on size.

    Input schema
    {
      "type": "object",
      "properties": {}
    }

analytics:read

  • get_reader_analytics

    Per-chapter reader stats for a published book (views, audio starts, completions, drop-off).

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_sensitivity_flags

    List sensitivity flags for a book.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        }
      },
      "required": [
        "bookId"
      ]
    }
  • list_jobs

    List background jobs (outline / write / narrate / pdf). status: 'all' | 'active' | 'finished'.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "enum": [
            "all",
            "active",
            "finished"
          ]
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50
        }
      }
    }
  • get_job_status

    Look up one background job.

    Input schema
    {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string"
        }
      },
      "required": [
        "jobId"
      ]
    }
  • get_production_job_status

    Poll a production (PDF/audiobook) job by id.

    Input schema
    {
      "type": "object",
      "properties": {
        "jobId": {
          "type": "string"
        }
      },
      "required": [
        "jobId"
      ]
    }
  • get_print_estimate

    Get a retail print-on-demand quote from Lulu for the book with the chosen product, quantity, shipping option, and destination address. Read-only — no order is placed. Page count is estimated from word count; the real value may shift by a few pages after `produce_book` runs the PDF render.

    Input schema
    {
      "type": "object",
      "properties": {
        "bookId": {
          "type": "string"
        },
        "productKey": {
          "type": "string",
          "description": "A key from `list_print_products` (e.g. \"paperback-6x9-bw\")."
        },
        "quantity": {
          "type": "integer",
          "minimum": 1,
          "maximum": 500
        },
        "shippingLevel": {
          "type": "string",
          "enum": [
            "MAIL",
            "PRIORITY_MAIL",
            "GROUND",
            "EXPEDITED",
            "EXPRESS"
          ]
        },
        "shippingAddress": {
          "type": "object",
          "description": "Lulu-style address (name, street1, city, state_code, postcode, country_code, …)."
        }
      },
      "required": [
        "bookId",
        "productKey",
        "quantity",
        "shippingLevel",
        "shippingAddress"
      ]
    }