Project-based email newsletter writing: keep per-project context (brand voice, goals, reference links, reusable 'fill' items like promo codes) and have newsletters written cheaply, with mechanical quality gates and self-review, grounded in that context. Read/edit full newsletters in the panel — chat never touches full bodies.
create_projectwriteCreate a new newsletter project — a container for one brand's context: goals, brand voice, keywords, useful links, socials, MailerLite targeting label. Use for: add a new newsletter project.
list_projectsreadList all newsletter projects — id, name, keywords, goals. Use for: list my newsletter projects, what newsletter projects do I have.
update_project_contextwriteUpdate a newsletter project's context — any of: name, description, brand voice, goals, keywords, useful links, social links, MailerLite targeting label/group ids. Only send fields that changed. Use for: add keywords to newsletter project, update brand voice, set MailerLite targeting.
delete_projectdestructivePermanently delete a newsletter project and ALL its newsletters, fill categories and fill items. Use for: delete this newsletter project, remove newsletter site.
open_projectwritePANEL-ONLY: switch the currently-open project (sidebar detail + workspace board). Not for chat use — this is pure UI navigation state, nothing about the project itself changes.
add_reference_linkwriteAdd ONE internal page of THIS project's own site as a reference link the newsletter writer may link to, with a short description of what that page is about. The writer uses the description to weave a natural, in-sentence anchor. Use for: add an internal link for the newsletter writer.
list_reference_linksreadList the internal reference links saved on a newsletter project. Use for: list reference links, what internal links can the newsletter writer use.
remove_reference_linkdestructiveRemove ONE internal reference link from a newsletter project by its URL. Use for: remove a reference link.
create_fill_categorywriteAdd a named 'stock' category (e.g. promo codes, priority links, topics to cover) to a newsletter project. Capped per project — ask the user proactively which categories they want. Use for: create a fill category, add a promo-code slot.
list_fill_categoriesreadList the fill categories (promo codes, links, topics, etc.) on a newsletter project. Use for: list fill categories.
delete_fill_categorydestructivePermanently delete a fill category and all its items. Use for: delete this fill category.
create_fill_itemwriteAdd one value (a promo code, a specific link, a topic) to a fill category. The generation pipeline rotates through items least-used-first. Use for: add an item to the category, add a value to fill category.
list_fill_itemsreadList the items in a fill category, least-used-first. Use for: list fill items.
update_fill_itemwriteChange a fill item's value/note, or retire it (is_active=false) without deleting its usage history — e.g. an expired promo code. Use for: retire this promo code, deactivate fill item.
delete_fill_itemdestructivePermanently delete one fill item. Use for: delete this fill item.
create_newsletterwriteCreate a new newsletter shell under a project — just a placeholder, no content yet. Does not call any AI. Follow up with generate_newsletter to actually write it. Use for: add a newsletter idea, start a new email draft.
list_newslettersreadList newsletters (metadata only — id, subject, status, word count, quality flags — never the full body). Optionally filter by project or status. Use for: list newsletters, what's in review, show idea/writing/review/scheduled/sent newsletters.
update_newsletter_statuswriteMove a newsletter to a new status: idea, writing, review, scheduled, sent. Use for: move this newsletter to review/scheduled.
update_newsletter_metawriteFix a newsletter's subject and/or preheader without touching the body. Use for: change the subject line.
update_newsletter_sectionwritePANEL-ONLY: directly overwrite one block's fields with EXACT values — a raw manual save, NOT an AI writing step (it skips the judge entirely). Not for chat use — Webbee should use generate_newsletter or patch_newsletter to write content.
save_full_newsletterwritePANEL-ONLY: replace the entire newsletter from the panel's single merged editor. The leading <h1> is the subject; everything after it splits into {heading, content} sections at heading boundaries (see richtext.py). Persists BOTH the subject and the body in one save — this is the one path that lets the subject or a section be edited/added/removed/reordered by editing the document directly. Not for chat use — Webbee should use generate_newsletter or patch_newsletter to write content.
read_full_newsletterreadRead the ENTIRE newsletter body as editable Markdown (# subject, ## section headings, body in light markdown). Returns the full text to chat on purpose — call this before editing so you work from the real current text, never from memory. (To hand a newsletter to another app like MailerLite/Mail/Notes, use export_newsletter_text instead — sending raw Markdown produces literal '**'/'##' characters in the recipient's inbox.) Use for: read the whole newsletter.
export_newsletter_textreadGet the FULL newsletter body — both as HTML (`html`: <h2>/<strong>/<ul> markup, no literal Markdown syntax) and plain text (`text`) — so it can be handed to another extension: MailerLite (create/update a campaign), Mail's send()/reply() (is_html=true), or Notes. ONLY call this when the user explicitly asks to send/export/copy the newsletter somewhere. Never call this for routine status checks or listing — use list_newsletters for those, which stays cheap on purpose.
edit_full_newsletterwriteReplace the ENTIRE newsletter with your edited version as Markdown (# subject, ## headings, body). Stores EXACTLY what you submit — nothing is re-generated — so first read_full_newsletter, change only what's needed, and resend the COMPLETE text with every unchanged part preserved verbatim. For a small targeted change prefer patch_newsletter. Use for: edit the newsletter.
delete_newsletterdestructivePermanently delete a newsletter. Use for: delete this newsletter.
generate_newsletterwriteStart writing a newsletter's first draft using the project's context (brand voice, goals, fill categories) plus a topic/goal brief and any real source facts (from web search or other extensions, e.g. an Article Writer article or Matomo/GSC data) the draft's claims must be grounded in. Runs in the background — it does not block. To see when it's done, call list_newsletters(status='review') a bit later: a newsletter's status lands on 'review' the moment its draft is ready, so that one call shows everything that finished — no job_id tracking needed. Use for: write the newsletter, draft this email.
patch_newsletterwriteRewrite ONE block of a newsletter by natural-language instruction (e.g. 'rewrite the block about the promo to be more urgent', 'shorten the intro'). Locates the block automatically (heading/keyword match) and returns a short preview — never the full body. Use for: shorten this newsletter's intro, make the CTA punchier.
Install Newsletter Writer and let Webbee use it across your workflow.
Open in panel