Connect once. Then create projects, review outlines, write chapters, manage covers, check credits, and export finished books without changing tools.
Hosted server
https://mcp.ebookbrew.com/mcpStart here
Add the server, confirm access in your browser, and return to your agent. Your password is never shared with the MCP client.
Add the hosted server to your MCP client.
Sign in and review the requested access.
Ask your agent to list or create a book.
Run one command in your terminal.
claude mcp add --transport http ebookbrew https://mcp.ebookbrew.com/mcpRun one command in your terminal.
codex mcp add ebookbrew --url https://mcp.ebookbrew.com/mcpAdd this object in Cursor MCP settings.
{
"mcpServers": {
"ebookbrew": {
"url": "https://mcp.ebookbrew.com/mcp"
}
}
}Choose a custom remote MCP server and enter this address.
https://mcp.ebookbrew.com/mcpIf your client does not support remote MCP servers, run npx ebookbrew-mcp login once. Then configure npx -y ebookbrew-mcp as a local server.
A capable agent can choose the right EBookBrew tools. State what you want, where approval is needed, and when the agent must stop.
Clear controls
Every change needs an idempotency key. Reuse a key only for the same attempted action.
Tool calls are free. Generation uses the normal price: brief 2, text chapter 1, coloring page 2, and cover 3 credits.
PDF, EPUB, and DOCX exports are free after the account buys a plan or credit pack.
Reference
Each tool has structured input and output. Errors return a stable code and a safe message.
Use this when the user wants to find or review their EBookBrew projects. Do not use it to create or change a project.
Scope: read
{
"page": 1,
"pageSize": 20
}{
"projects": [],
"page": 1,
"pageSize": 20,
"total": 0,
"hasMore": false
}Use this when the user wants one project with its brief, chapter status, cover versions, and cached exports. Chapter text is omitted to keep this response small; call get_chapter for one full chapter.
Scope: read
{
"projectId": "11111111-1111-4111-8111-111111111111"
}{
"project": {
"id": "11111111-1111-4111-8111-111111111111",
"concept": "A guide to quiet launches",
"format": "guide",
"audience": null,
"tone": null,
"status": "draft",
"headingPageBreak": "none",
"interiorTheme": "classic",
"pageSize": "a5",
"designFont": "source-serif",
"textColor": "ink",
"fontSize": null,
"lineHeight": null,
"title": null,
"writeAll": {
"active": false,
"stopReason": null
},
"createdAt": "2026-08-23T12:00:00.000Z",
"updatedAt": "2026-08-23T12:00:00.000Z"
},
"brief": null,
"chapters": [],
"covers": [],
"exports": []
}Use this when the user or agent needs the full text or page image for one chapter position.
Scope: read
{
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1
}{
"chapter": {
"id": "33333333-3333-4333-8333-333333333333",
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"kind": "chapter",
"title": "Start small",
"summary": "Define a narrow promise",
"guidance": null,
"content": "# Start small\n\nA focused launch begins...",
"imageUrl": null,
"version": 1,
"wordCount": 820,
"status": "done"
}
}Use this when the user has a book concept and wants a new EBookBrew project. This saves the concept only; call generate_brief next to create an outline.
Scope: generate
{
"concept": "A practical guide to quiet product launches",
"format": "guide",
"audience": "solo founders",
"tone": "calm and direct",
"idempotencyKey": "launch-guide-001"
}{
"project": {
"id": "11111111-1111-4111-8111-111111111111",
"concept": "A practical guide to quiet product launches",
"format": "guide",
"audience": "solo founders",
"tone": "calm and direct",
"status": "draft",
"headingPageBreak": "none",
"interiorTheme": "classic",
"pageSize": "a5",
"designFont": "source-serif",
"textColor": "ink",
"fontSize": null,
"lineHeight": null,
"title": null,
"writeAll": {
"active": false,
"stopReason": null
},
"createdAt": "2026-08-23T12:00:00.000Z",
"updatedAt": "2026-08-23T12:00:00.000Z"
}
}Use this to change the source concept, format, audience, or tone before a brief exists. After brief generation, update the brief instead so the plan and manuscript stay consistent.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"audience": "first-time founders",
"tone": "concise",
"idempotencyKey": "project-edit-001"
}{
"project": {
"id": "11111111-1111-4111-8111-111111111111",
"concept": "A practical guide to quiet product launches",
"format": "guide",
"audience": "solo founders",
"tone": "calm and direct",
"status": "draft",
"headingPageBreak": "none",
"interiorTheme": "classic",
"pageSize": "a5",
"designFont": "source-serif",
"textColor": "ink",
"fontSize": null,
"lineHeight": null,
"title": null,
"writeAll": {
"active": false,
"stopReason": null
},
"createdAt": "2026-08-23T12:00:00.000Z",
"updatedAt": "2026-08-23T12:00:00.000Z"
}
}Use this only when the user asks to remove a project from their library. This archives the project and blocks access, but keeps its data and audit records.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"idempotencyKey": "archive-project-001"
}{
"archived": true,
"projectId": "11111111-1111-4111-8111-111111111111"
}Use this when a project needs its first title options, chapter plan, and writing brief. Do not call it after approval; use update_brief for later changes.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"targetChapterCount": 12,
"idempotencyKey": "brief-001"
}{
"brief": {
"id": "22222222-2222-4222-8222-222222222222",
"projectId": "11111111-1111-4111-8111-111111111111",
"title": "The Quiet Launch",
"titleOptions": [
"The Quiet Launch",
"Launch Without Noise",
"Small Audience, Strong Launch"
],
"subtitle": "A practical guide for solo founders",
"authorName": null,
"targetWordCount": 9000,
"chapterPlan": [],
"approvedAt": null
}
}Use this when the user wants to edit the title, author, word count, or chapter plan before or after approval. This can invalidate an active cover when title data changes.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"title": "The Quiet Launch",
"subtitle": "Launch well without a large audience",
"authorName": "A. Writer",
"targetWordCount": 9000,
"chapterPlan": [
{
"position": 1,
"title": "Start small",
"summary": "Define a narrow promise",
"guidance": null
}
],
"idempotencyKey": "brief-edit-001"
}{
"brief": {
"id": "22222222-2222-4222-8222-222222222222",
"projectId": "11111111-1111-4111-8111-111111111111",
"title": "The Quiet Launch",
"titleOptions": [],
"subtitle": "Launch well without a large audience",
"authorName": "A. Writer",
"targetWordCount": 9000,
"chapterPlan": [],
"approvedAt": null
}
}Use this only after the user accepts the title and chapter plan. Approval creates the chapter records and opens chapter writing.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"title": "The Quiet Launch",
"subtitle": "Launch well without a large audience",
"authorName": "A. Writer",
"targetWordCount": 9000,
"chapterPlan": [
{
"position": 1,
"title": "Start small",
"summary": "Define a narrow promise",
"guidance": null
}
],
"idempotencyKey": "brief-approve-001"
}{
"approved": true,
"projectId": "11111111-1111-4111-8111-111111111111"
}Use this when an approved brief has a pending chapter that the user wants written. Write one chapter per call; do not loop without the user's requested chapter range. In a coloring_book project the chapter is a drawn page and costs 2 credits.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"idempotencyKey": "chapter-1-write-001"
}{
"chapter": {
"id": "33333333-3333-4333-8333-333333333333",
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"kind": "chapter",
"title": "Start small",
"summary": "Define a narrow promise",
"guidance": null,
"content": "# Start small\n\nA focused launch begins...",
"imageUrl": null,
"version": 1,
"wordCount": 820,
"status": "done"
}
}Use this when the user wants the whole book written. The server writes the pending and failed chapters in order, one charge per chapter (1 credit; 2 credits per coloring_book page), and this call returns at once. Poll get_project: the chain has finished when project.writeAll.active is false. project.writeAll.stopReason is null after a clean finish; insufficient_credits, rate_limited, chapter_failed, or error means it stopped early and the remaining chapters are still pending or failed.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"idempotencyKey": "write-all-001"
}{
"projectId": "11111111-1111-4111-8111-111111111111",
"queuedChapterCount": 8
}Use this when the user asks to stop an active write-all run. The current chapter can finish, but no later chapter will start.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"idempotencyKey": "stop-write-all-001"
}{
"stopped": true,
"projectId": "11111111-1111-4111-8111-111111111111"
}Use this when the user wants another version of an existing chapter. Include concrete revision guidance when the user gave it. In a coloring_book project this redraws the page and costs 2 credits.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"revisionGuidance": "Add one concrete example and shorten the opening.",
"idempotencyKey": "chapter-1-revise-001"
}{
"chapter": {
"id": "33333333-3333-4333-8333-333333333333",
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"kind": "chapter",
"title": "Start small",
"summary": "Define a narrow promise",
"guidance": null,
"content": "# Start small\n\nStart with one reader...",
"imageUrl": null,
"version": 2,
"wordCount": 790,
"status": "done"
}
}Use this before restoring an earlier generated chapter or coloring page. It returns version IDs and revision notes, but not duplicate manuscript text.
Scope: read
{
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1
}{
"versions": [
{
"id": "66666666-6666-4666-8666-666666666666",
"version": 2,
"revisionGuidance": "Shorten the opening.",
"createdAt": "2026-08-23T12:30:00.000Z"
}
]
}Use this only when the user chooses an earlier saved version. It makes that version the current chapter without deleting any saved versions.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"versionId": "66666666-6666-4666-8666-666666666666",
"idempotencyKey": "restore-chapter-001"
}{
"chapter": {
"id": "33333333-3333-4333-8333-333333333333",
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"kind": "chapter",
"title": "Start small",
"summary": "Define a narrow promise",
"guidance": null,
"content": "# Start small\n\nStart with one reader...",
"imageUrl": null,
"version": 2,
"wordCount": 790,
"status": "done"
}
}Use this when the user supplies manual chapter edits or metadata changes. This overwrites the current editable chapter, so do not call it without the user's replacement text or requested changes.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"content": "# Start small\n\nEdited chapter text.",
"idempotencyKey": "chapter-1-edit-001"
}{
"chapter": {
"id": "33333333-3333-4333-8333-333333333333",
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 1,
"kind": "chapter",
"title": "Start small",
"summary": "Define a narrow promise",
"guidance": null,
"content": "# Start small\n\nEdited chapter text.",
"imageUrl": null,
"version": 1,
"wordCount": 6,
"status": "done"
}
}Use this when the user wants to insert authored text into an approved manuscript. A manual chapter is numbered; a section is unnumbered and uses only its title.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"kind": "section",
"title": "Credits",
"position": 9,
"idempotencyKey": "credits-001"
}{
"chapter": {
"id": "55555555-5555-4555-8555-555555555555",
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 9,
"kind": "section",
"title": "Credits",
"summary": "",
"guidance": null,
"content": "",
"imageUrl": null,
"version": 0,
"wordCount": 0,
"status": "draft"
}
}Use this only when the user asks to permanently delete a chapter or section and its saved versions. At least one manuscript item must remain.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 9,
"idempotencyKey": "delete-credits-001"
}{
"deleted": true,
"projectId": "11111111-1111-4111-8111-111111111111",
"position": 9
}Use this when the user wants AI cover artwork for a project with a brief. Omit sourceCoverId to create new artwork from the prompt and style; pass sourceCoverId with revisionGuidance to edit the current artwork. Both charge credits; do not use it for text-only edits.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"prompt": "One paper boat crossing a calm dark lake",
"style": "minimal",
"idempotencyKey": "cover-001"
}{
"cover": {
"id": "44444444-4444-4444-8444-444444444444",
"projectId": "11111111-1111-4111-8111-111111111111",
"imageUrl": "https://example.public.blob.vercel-storage.com/cover.jpg",
"promptUsed": "One paper boat...",
"editable": true,
"style": "minimal",
"direction": "One paper boat crossing a calm dark lake",
"textSettings": {
"font": "serif",
"fade": 0.6,
"title": {
"scale": 1,
"color": "#FFFFFF",
"alignment": "left"
},
"subtitle": {
"scale": 1,
"color": "#FFFFFF"
},
"author": {
"scale": 1,
"color": "#FFFFFF",
"alignment": "left"
},
"titlePosition": {
"x": 0.1,
"y": 0.11
},
"authorPosition": {
"x": 0.1,
"y": 0.88
}
},
"trim": "1600x2560",
"isActive": true,
"createdAt": "2026-08-23T12:00:00.000Z"
}
}Use this to change the font, fade strength, or the per-block size, color, and alignment of the title, subtitle, and author on an editable cover. This re-renders the cover in place without an AI call or credit charge.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"coverId": "44444444-4444-4444-8444-444444444444",
"textSettings": {
"font": "sans",
"fade": 0.6,
"title": {
"scale": 1.1,
"color": "#F6EEE1",
"alignment": "center"
},
"subtitle": {
"scale": 1,
"color": "#F6EEE1"
},
"author": {
"scale": 1,
"color": "#E8C46A",
"alignment": "center"
},
"titlePosition": {
"x": 0.5,
"y": 0.12
},
"authorPosition": {
"x": 0.5,
"y": 0.88
}
},
"idempotencyKey": "cover-text-001"
}{
"cover": {
"id": "44444444-4444-4444-8444-444444444444",
"projectId": "11111111-1111-4111-8111-111111111111",
"imageUrl": "https://example.public.blob.vercel-storage.com/cover.jpg",
"promptUsed": "One paper boat...",
"editable": true,
"style": "minimal",
"direction": "One paper boat crossing a calm dark lake",
"textSettings": {
"font": "serif",
"fade": 0.6,
"title": {
"scale": 1,
"color": "#FFFFFF",
"alignment": "left"
},
"subtitle": {
"scale": 1,
"color": "#FFFFFF"
},
"author": {
"scale": 1,
"color": "#FFFFFF",
"alignment": "left"
},
"titlePosition": {
"x": 0.1,
"y": 0.11
},
"authorPosition": {
"x": 0.1,
"y": 0.88
}
},
"trim": "1600x2560",
"isActive": true,
"createdAt": "2026-08-23T12:00:00.000Z"
}
}Use this when the user chooses one existing cover version for export. Editable covers are re-rendered with the current book title before activation.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"coverId": "44444444-4444-4444-8444-444444444444",
"idempotencyKey": "activate-cover-001"
}{
"cover": {
"id": "44444444-4444-4444-8444-444444444444",
"projectId": "11111111-1111-4111-8111-111111111111",
"imageUrl": "https://example.public.blob.vercel-storage.com/cover.jpg",
"promptUsed": "One paper boat...",
"editable": true,
"style": "minimal",
"direction": "One paper boat crossing a calm dark lake",
"textSettings": {
"font": "serif",
"fade": 0.6,
"title": {
"scale": 1,
"color": "#FFFFFF",
"alignment": "left"
},
"subtitle": {
"scale": 1,
"color": "#FFFFFF"
},
"author": {
"scale": 1,
"color": "#FFFFFF",
"alignment": "left"
},
"titlePosition": {
"x": 0.1,
"y": 0.11
},
"authorPosition": {
"x": 0.1,
"y": 0.88
}
},
"trim": "1600x2560",
"isActive": true,
"createdAt": "2026-08-23T12:00:00.000Z"
}
}Use this when the user picks an interior theme, page size, font, text color, text size, line height, or heading page breaks for the book's exports. Omitted fields return to their defaults. The next export re-renders with the new design.
Scope: generate
{
"projectId": "11111111-1111-4111-8111-111111111111",
"theme": "elegant",
"pageSize": "trade",
"font": "traditional-serif",
"textColor": "espresso",
"idempotencyKey": "design-001"
}{
"project": {
"id": "11111111-1111-4111-8111-111111111111",
"concept": "A practical guide to quiet product launches",
"format": "guide",
"audience": "solo founders",
"tone": "calm and direct",
"status": "writing",
"headingPageBreak": "none",
"interiorTheme": "elegant",
"pageSize": "trade",
"designFont": "traditional-serif",
"textColor": "espresso",
"fontSize": null,
"lineHeight": null,
"title": "The Quiet Launch",
"writeAll": {
"active": false,
"stopReason": null
},
"createdAt": "2026-08-23T12:00:00.000Z",
"updatedAt": "2026-08-23T12:00:00.000Z"
}
}Use this to download a full book, content without a cover, or the active cover image. Book exports require every chapter to be complete. Cover-only downloads need only a saved cover and return JPG; kind is ignored. All downloads need a paid account. Give the user the link; it downloads in their signed-in browser.
Scope: export
{
"projectId": "11111111-1111-4111-8111-111111111111",
"kind": "epub",
"idempotencyKey": "export-epub-001"
}{
"exportId": "77777777-7777-4777-8777-777777777777",
"kind": "epub",
"filename": "weekend-sourdough.epub",
"url": "https://ebookbrew.com/api/books/11111111-1111-4111-8111-111111111111/exports/epub",
"cached": false
}Use this when the user asks to buy a plan or credit pack. Return the secure link and let the user finish payment in their browser.
Scope: generate
{
"purchase": "subscription",
"plan": "pour_over",
"idempotencyKey": "checkout-plan-001"
}{
"url": "https://checkout.example.com/session"
}Use this when the user asks to manage a plan, payment method, invoices, or cancellation. Return the secure link and let the user make billing changes in their browser.
Scope: generate
{
"idempotencyKey": "billing-portal-001"
}{
"url": "https://billing.example.com/session"
}Use this when the user asks about credits, plan status, renewal, or export access. Use create_checkout or get_billing_portal_link only when the user asks to take a billing action.
Scope: read
{}{
"credits": 25,
"downloadsUnlocked": false,
"hasActiveSubscription": false,
"plan": null,
"subscriptionCreditsExpireAt": null,
"pricingUrl": "https://ebookbrew.com/pricing",
"billingUrl": "https://ebookbrew.com/settings/billing"
}Use this when the user wants their recent brief, chapter, or cover generation status and credit use. Do not use it to read agent request logs.
Scope: read
{
"limit": 25
}{
"generations": []
}Open MCP settings to control access and review activity.