# Beehiiv MCP MCP Server

> **Beehiiv MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to Beehiiv MCP.
>
> MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows,
> token refresh, and production-grade auto-scaling — so your AI agents can connect to
> third-party services and run freely without you managing any MCP server yourself.
>
> Server page:  https://mewcp.com/mcp/beehiiv-mcp
> MewCP docs:   https://docs.mewcp.com
> Full catalog: https://mewcp.com/llms.txt

---

## About

beehiiv streamlines newsletter publishing and audience growth by creating and editing posts, managing subscriber lists and segments, automating email journeys, analyzing engagement and advertising revenue, managing paid recommendations, and publishing podcast episodes.

---

## Details

- Server ID: `beehiiv-mcp`
- Version: v10019
- Tools: 235
- Authentication: OAuth, managed by MewCP
- Transport: http

---

## Access

The gateway URL below serves your **entire MewCP toolset**, not this server on its
own. Pasting a config snippet is not enough — Beehiiv MCP has to be in the toolset
first. In order:

1. Add Beehiiv MCP to your toolset at https://mewcp.com/mcp/beehiiv-mcp
2. Connect your Beehiiv MCP account (OAuth); MewCP stores the credential and attaches it to each call
3. Copy your MewCP API key from the dashboard (Developer)
4. Configure your client with the snippet for it below

Once connected, an agent does **not** see this server's tools as top-level tools.
It sees four meta-tools and reaches everything through them:

- `search(query)` — find tools by keyword across the toolset
- `get_schema(tools)` — full description and arguments for the tools you picked
- `list_accounts(provider)` — only when one app has several connected accounts
- `call_tool(server_maskedId, tool_name, args)` — execute

So the list below is what `search` can return for this server, not a set of
callable tool names on their own.

---

## Tools (235)

Descriptions are truncated to 160 characters; call `get_schema`
for the full text and the argument schema. Where a tool is annotated, its type
is shown — treat `destructive` as irreversible.

- `get_ad_report` _(read)_ — The full performance and payment report for one ad placement: earnings and payout status, payout model and rate, recipients and delivery rate, unique opens and…
- `list_ad_offers` _(read)_ — The ads a publication can currently place in a post: 'available_offers' (unclaimed offers the publisher hasn't acted on) and 'pending_opportunities' (offers…
- `list_ad_opportunities` _(read)_ — A publication's ad opportunity history - opportunities already acted on (accepted, pending, rejected, expired, canceled, missed). Use it to check the status of…
- `list_ad_reports` _(read)_ — What a publication earned from the beehiiv ad network, post by post. One row per ad that has run, with the post it appeared in, the advertiser, how much it…
- `generate_image` _(write)_ — Generate an AI image from a text prompt and save it to a publication's media library. Fire-and-forget: this enqueues a background job and returns immediately…
- `get_asset` _(read)_ — Get a single asset from the media library with full details including usage information
- `get_image_generation_status` _(read)_ — Check the status of an AI image generation started by `generate_image`: "pending", "processing", "completed" (the response then carries full asset details) or…
- `list_assets` _(read)_ — Search and browse a publication's media library. Supports text search, file type filtering, and folder filtering. Use an asset's `url` when placing it in post…
- `save_audio` _(write)_ — Upload an audio file from a URL to a publication's media library. Returns the downloadable ID and metadata for embedding an audio widget via `save_post` or…
- `save_file` _(write)_ — Upload a file from a URL to a publication's media library. Returns the downloadable ID and metadata for embedding a fileAttachment widget via `save_post` or…
- `save_image` _(write)_ — Upload an image to a publication's media library from a URL or raw base64 bytes. Returns the asset ID and the hosted image URL. The returned `id` can be used…
- `update_asset` _(write)_ — Update the metadata of an existing asset in a publication's media library. At least one editable field is required.
- `add_automation_step` _(write)_ — Add a single step to an existing automation's flow. Works on live (published) automations: the step is added to a staging workspace (a draft copy) and only…
- `delete_automation_step` _(destructive)_ — Delete a single step from an existing automation's flow. Works on live (published) automations: the deletion is applied to a staging workspace (a draft copy)…
- `delete_automation_trigger` _(destructive)_ — Delete a trigger from an automation. Always edits a staging workspace (a draft copy); the live automation is unchanged until a human publishes from the editor.…
- `edit_automation_email_content` _(destructive)_ — Edit an existing automation email's body incrementally by targeting individual blocks - cheaper and safer than resending the whole body with…
- `get_automation` _(read)_ — Get an automation's full configuration including triggers, step flow, email metadata, and branch paths. Use workspace parameter to inspect live (published) or…
- `get_automation_email_content` _(read)_ — Get the rendered content of an automation step's email. 'editor_html' returns canonical HTML compatible with save_automation_email and, for small changes,…
- `get_automation_journey` _(read)_ — Get detailed information about a single automation journey, including all journey steps, branch decisions, and per-subscriber email engagement metrics (open…
- `get_automation_schema` _(read)_ — Get the Automation reference: trigger event main_conditions shapes, step type params, branch paths, resources, and email authoring workflow.
- `get_automation_stats` _(read)_ — Get performance metrics for an automation. Returns overall stats, per-email breakdown, and optionally per-step subscriber counts with branch decisions. Rates…
- `get_automation_workspace_diff` _(read)_ — Compare an automation's staging workspace against its live (published) version. Returns a summary of what changed: added, removed, or modified steps and…
- `list_automation_emails` _(read)_ — List the emails sent by an automation. Use this to discover send_email step IDs before calling save_automation_email or get_automation_email_content.
- `list_automation_journeys` _(read)_ — List subscriber journeys for a given automation with optional filtering by status, email, and time period. Returns journey details with cursor-based…
- `list_automations` _(read)_ — List automations for a given publication with optional filtering by state and trigger event
- `reorder_automation_steps` _(write)_ — Reorder automation steps in bulk. Pass `bulk_updates` keyed by live or staging automation_step_id. Each update can set `parent_id`, `branch_arm`, and…
- `save_automation` _(destructive)_ — Create or update an automation. Call `get_automation_schema` first for trigger event shapes, step type params, branch paths, and the resources map. - Create:…
- `save_automation_email` _(destructive)_ — Create or update the email for an automation's send_email step. Can be called multiple times - each call replaces the full content. Uses the same HTML syntax…
- `save_automation_trigger` _(write)_ — Create or update a trigger on an automation. Automations support up to 3 triggers (any of which can enrol a subscriber). Always edits a staging workspace (a…
- `update_automation_step` _(destructive)_ — Update a single step on an existing automation's flow. Works on live (published) automations: the change is applied to a staging workspace (a draft copy) and…
- `ban_community_member` _(destructive)_ — Ban or unban a community member. Banning blocks them from posting, commenting, and DMs; pass banned=false to lift a ban. Defaults to banning. Idempotent - a…
- `create_community_invite` _(write)_ — Invite people to a publication's community from one of three audiences - a set of subscriber segments, a list of email addresses, or recommended subscribers.…
- `get_community` _(read)_ — Get a publication's community: branding, sync toggles, tier gating, Luma calendar, and PWA. Returns `exists: false` when the publication has not created a…
- `get_community_channel` _(read)_ — Get a community channel with its display position, default flag, and access gating: `gated` is true when members need a premium tier or a matching custom field…
- `get_community_member` _(read)_ — Get a community member's profile, roles, and banned/removed status.
- `get_community_metrics` _(read)_ — Get a publication's community overview metrics for a period: new members, posts created, comments and replies, and member participation, each with the period…
- `get_community_post` _(read)_ — Get a community post with its threaded comments and a summary of any attached content (embedded Post, Poll, Survey, or Podcast presented as type + id).…
- `learn_community_authoring` _(read)_ — Learn the HTML contract for authoring community posts and comments with save_community_post, schedule_community_post and save_community_post_comment. Returns…
- `list_community_channels` _(read)_ — List a publication's community channels in display order. Each channel is flagged as default or not, with `gated` true when members need a premium tier or a…
- `list_community_dm_messages` _(read)_ — List the messages in a direct-message conversation, oldest first. Readable only when the community owner participates in the conversation; otherwise returns…
- `list_community_dms` _(read)_ — List the community owner's direct-message conversations, most recently updated first. Only conversations the owner participates in are returned. Use…
- `list_community_invites` _(read)_ — List a publication's pending community invites (people invited who have not joined yet), newest first. Optionally filter by a name or email search.
- `list_community_members` _(read)_ — List a publication's community members (most recently joined first). Optionally filter by role, status (active, banned, or removed), or a name/email search.
- `list_community_post_comments` _(read)_ — List the comments on a community post, oldest first, with their nested replies. Paginated. Use this when you only need the comment thread for a post you…
- `list_community_posts` _(read)_ — List a publication's community posts as the publisher sees them, pinned first then newest. Includes removed posts (each carries a `removed` flag). Optionally…
- `list_community_reports` _(read)_ — List a publication's community moderation queue - reports on posts and comments, ordered for review (pending first, then most-reported, then newest).…
- `list_recommended_community_subscribers` _(read)_ — List a publication's most engaged subscribers (ranked by email open and click rate) as candidates to invite to the community. Feed the returned…
- `pin_community_post` _(write)_ — Pin or unpin a community post in its channel. Defaults to pinning; pass pinned=false to unpin. Idempotent - a post already in the requested state is left…
- `resolve_community_report` _(write)_ — Dismiss a community report, marking it and every other pending report on the same content as resolved. Does not remove content - use ban_community_member to…
- `save_community` _(destructive)_ — Create or update a publication's community. If the publication has no community yet, one is created; otherwise the existing community is updated. Omitted…
- `save_community_channel` _(destructive)_ — Create or update a channel in a publication's community. Omit community_channel_id to create a new channel; provide it to update an existing one. Gate a…
- `save_community_notification_emails` _(write)_ — Turn a community's notification emails on or off and set the From name members see. Members get these emails when something in the community concerns them: a…
- `save_community_post` _(destructive)_ — Create or update a community post, authored as the publication owner. To create, provide a community_channel_id; to update, provide a community_post_id (only…
- `save_community_post_comment` _(destructive)_ — Create or update a comment on a community post, authored as the publication owner. To create, provide a community_post_id (and parent_comment_id to reply to…
- `send_community_dm` _(write)_ — Send a direct message to a community member, delivered as the publication owner. Reuses the existing 1:1 conversation or creates one. Because the message is…
- `update_community_member_roles` _(destructive)_ — Replace a community member's role. Pass a single role to grant (admin, manager, or moderator); an empty array clears the role, leaving them a plain member. A…
- `get_condition_set` _(read)_ — Retrieve detailed information about a condition set, including its full definition
- `get_condition_set_schema` _(read)_ — Get the condition set schema: available condition types, attributes, operators, and structure.
- `list_condition_sets` _(read)_ — List condition sets for a publication, with optional filtering by status
- `save_condition_set` _(write)_ — Create or update a reusable condition set. Call `get_condition_set_schema` first to learn the available condition types, attributes, operators, and structure.…
- `list_content_tags` _(read)_ — List and search content tags for a given publication
- `save_content_tag` _(write)_ — Create or update a content tag used to organise posts on the website. If content_tag_id is provided, updates the existing tag; otherwise creates a new one.…
- `get_crawler_analytics` _(read)_ — Get AI crawler and bot analytics for a publication's website — total, served, and blocked requests, AI-crawler share, per-crawler breakdown, top crawled pages,…
- `read_documentation` _(read)_ — Read the full content of a documentation article, blog post, glossary term, or runbook by its ID
- `search_documentation` _(read)_ — Search beehiiv's documentation for support articles, blog posts, glossary terms, and runbooks
- `list_external_rss_feeds` _(read)_ — List external RSS feeds configured for a publication. Each feed defines an inbound RSS source with display preferences (thumbnail position, CTA style, which…
- `save_external_rss_feed` _(write)_ — Create or update an external RSS feed for a publication. If external_rss_feed_id is provided, updates the existing feed; otherwise creates a new one. When…
- `get_group_subscription` _(read)_ — Get a single group subscription: its tier, purchaser, seat counts, per-seat price, list price, the tier's current group discount (it can differ from the…
- `get_group_subscription_deal` _(read)_ — Get a single custom group subscription deal: its negotiated seats and price, contacts, payment method, purchase link or invoice URL, and the group subscription…
- `list_group_subscription_deals` _(read)_ — List a publication's custom group subscription deals: negotiated seat counts and prices offered to one organization through a purchase link or invoice. A…
- `list_group_subscription_seats` _(read)_ — List the seats of one group subscription: who was invited, who filled a seat, and who left. subscription_id is set once a seat is filled; pass it to…
- `list_group_subscriptions` _(read)_ — List a publication's group subscriptions: one purchaser buys a block of paid seats on a tier and invites members to fill them. Each result includes the tier,…
- `save_newsletter_list_preference` _(write)_ — Create or update the subscriber preference-center entry for a newsletter list. Each list has at most one preference, shown in the subscriber preference center…
- `get_opt_in_email` _(read)_ — Get the opt-in confirmation email for a publication. Returns the subject line, preview text, and content as editor HTML. Call save_opt_in_email to make changes.
- `save_opt_in_email` _(destructive)_ — Update the opt-in confirmation email for a publication. Pass html_content to replace the body, subject_line to change the subject, and/or preview_text for the…
- `get_order` _(read)_ — Get an order's full details, including the buyer (subscription id, email, status), line items, refund status, and fulfillment status.
- `list_orders` _(read)_ — List orders (purchases) for a publication with optional filtering and pagination. Each order includes the buyer (subscription id, email, status) that placed…
- `list_paywalls` _(read)_ — List paywall configurations for a given publication. Each paywall has a unique ID that can be used with save_post or edit_post_content to insert a specific…
- `delete_podcast_episode` _(destructive)_ — Delete a podcast episode and its audio files. A published episode disappears from the show's RSS feed. This cannot be undone through the API.
- `delete_podcast_show` _(destructive)_ — Delete a podcast show and all of its episodes. The show's RSS feed stops serving. This cannot be undone through the API.
- `get_podcast_episode` _(read)_ — Retrieve detailed information about a podcast episode
- `get_podcast_episode_stats` _(read)_ — Get performance metrics for a specific podcast episode — total downloads, unique listeners with period-over-period growth, plus top listening apps, countries,…
- `get_podcast_episode_transcript` _(read)_ — Retrieve the plain text transcript for a podcast episode
- `get_podcast_show` _(read)_ — Retrieve detailed information about a podcast show including categories, platform links, and episode count
- `get_podcast_show_stats` _(read)_ — Get performance metrics for a podcast show — total downloads, unique listeners with period-over-period growth, plus top listening apps, countries, and cities…
- `list_podcast_categories` _(read)_ — List the Apple Podcasts categories and subcategories available for podcast shows. Use the returned ids with save_podcast_show's categories parameter.
- `list_podcast_episodes` _(read)_ — List episodes for a podcast show with optional filtering by status
- `list_podcast_shows` _(read)_ — List podcast shows for a given publication with optional filtering by status
- `save_podcast_episode` _(destructive)_ — Create or update a podcast episode. If podcast_episode_id is provided, updates the existing episode; otherwise creates a new one. When creating,…
- `save_podcast_show` _(destructive)_ — Create or update a podcast show. If podcast_show_id is provided, updates the existing show; otherwise creates a new one. When creating, publication_id, title,…
- `get_poll` _(read)_ — Get a poll's details including choices and response counts
- `list_poll_responses` _(read)_ — List individual poll responses showing which subscribers voted for which choice
- `list_polls` _(read)_ — List polls for a given publication with optional filtering by status and type
- `save_poll` _(destructive)_ — Create or update a poll. If poll_id is provided, updates the existing poll; otherwise creates a new one. When creating, name, question, and choices (at least…
- `duplicate_post` _(write)_ — Duplicate an existing post within its publication. Creates a new draft copy with " (N)" appended to the title, carrying over the body content, theme, audience…
- `duplicate_post_template` _(write)_ — Duplicate an existing post template into a new template in the same publication. The copy includes the template's content, theme, settings, and metadata, with…
- `edit_post` _(destructive)_ — Change an existing post's metadata (title, subtitle, audience, settings, SEO, content tags). This is a partial patch - only the fields you send change (e.g.…
- `edit_post_content` _(destructive)_ — Edit an existing post's body incrementally by targeting individual blocks - cheaper and safer than rewriting the whole body. Untouched blocks are left exactly…
- `edit_post_template` _(destructive)_ — Update a post template's metadata. This is a partial patch - only fields you send are changed. To replace the template's body content, use…
- `edit_post_template_content` _(destructive)_ — Edit a post template's body incrementally by targeting individual blocks, or replace the entire body with `html_content`. For incremental edits, read the…
- `get_post` _(read)_ — Get a post's metadata and configuration. Read its body with get_post_content.
- `get_post_content` _(read)_ — Get the content of a post in a specified format (text, html, or editor_html), optionally simulating how it appears for different subscriber types
- `get_post_footer` _(read)_ — Read the publication's custom email footer - the block of content that renders at the bottom of every post's email, above the copyright line, mailing address,…
- `get_post_stats` _(read)_ — Get performance metrics for a specific post — email delivery, open rate, click-through rate, bounce rate, unsubscribe rate, and web engagement.
- `get_post_stats_batch` _(read)_ — Get performance metrics for multiple posts in one call — per-post email delivery, open rate, click-through rate, unsubscribes, and web engagement. Returns a…
- `get_post_template_content` _(read)_ — Read a post template's body as canonical editor HTML - the shape `edit_post_template_content` accepts, so what you read here can be edited and sent straight…
- `get_post_theme` _(read)_ — Read the theme design tokens a post renders with - fonts, colors, spacing, borders and backgrounds across text, tables, buttons, quotes, images and layout.…
- `learn_post_authoring` _(read)_ — Learn the canonical HTML contract used by `save_post` and `edit_post_content` for a specific publication. Returns a TOC of every node and mark with example…
- `learn_post_metadata` _(read)_ — Reference for the typed config accepted by `save_post` (on create) and `edit_post` (on edit) — recipients, web/email/seo settings, content tags, and other…
- `list_post_click_subscribers` _(read)_ — List subscribers who clicked links in a post, with each subscriber's acquisition channel and source. Omit url_hash to return every click across all the post's…
- `list_post_clicks` _(read)_ — Get per-link click breakdown for a specific post. Returns individual URL click counts (email and web) rather than aggregate post-level stats.
- `list_post_comments` _(read)_ — List the public reader comments on a published post (the comment section readers see on the live page), oldest first, with their nested replies - not the…
- `list_post_editor_comments` _(read)_ — List the team comment threads left directly in the post editor (the "leave a comment for team members" collaboration feature) - not the public reader comment…
- `list_post_subscriber_engagement` _(read)_ — List per-subscriber engagement for a post. Each row reports a subscriber's status, their total opens and clicks, and the subscriber's acquisition channel and…
- `list_post_templates` _(read)_ — List post templates for a given publication
- `list_posts` _(read)_ — List posts for a given publication with optional filtering by status and content tags
- `save_post` _(write)_ — Create a new draft post. Promotion/publish remains a human action via the beehiiv UI. To change an existing post's metadata (title, settings, audience) use…
- `save_post_footer` _(destructive)_ — Write the publication's custom email footer incrementally by targeting blocks, or replace it entirely. For incremental edits, read the footer once with…
- `save_post_template` _(write)_ — Create a new reusable post template with metadata and optional body content. To update an existing template's metadata, use `edit_post_template`. To replace…
- `save_post_template_theme` _(write)_ — Set a post template's theme design tokens - fonts, colors, spacing, borders, and backgrounds across text, tables, buttons, quotes, images, and layout (the…
- `save_post_theme` _(write)_ — Set the theme design tokens for a single post - fonts, colors, spacing, borders, and backgrounds across text, tables, buttons, quotes, images, and layout (the…
- `save_split_test` _(destructive)_ — Set up an A/B test of email subject lines on a post that has not sent yet. The post's own subject line (`email_settings.email_subject_line` on `save_post` /…
- `search_cashtags` _(read)_ — Search for stock/crypto tickers (cashtags) via StockTwits. Returns matching symbols that can be inserted as inline cashtag elements in post content via…
- `get_premium_offer` _(read)_ — Get a single paid subscription offer, including its terms, the tiers and billing cadences it applies to, and how many times it has been redeemed. An empty…
- `list_premium_offers` _(read)_ — List a publication's paid subscription offers - percent discounts, free trials and paid trials that convert readers into paying subscribers. An offer with an…
- `assign_product_tags_to_product` _(write)_ — Replace the full set of tags assigned to a product. product_tag_ids is the complete desired tag list, not a delta - it replaces any existing assignments. Pass…
- `duplicate_product` _(write)_ — Duplicate an existing product. Creates a draft copy with "(COPY)" appended to the name and a "-copy" slug, including its variant, pricing and redeemable.
- `get_product` _(read)_ — Get a product's full details including variants, tags, and sales totals
- `get_product_review_settings` _(read)_ — Get product review moderation and display settings for a publication
- `list_product_coupons` _(read)_ — List and filter publication discount codes using the same controls and fields as the products UI
- `list_product_promotion_codes` _(read)_ — List promotion codes, including deleted codes, for a publication-scoped product coupon
- `list_product_reviews` _(read)_ — List and filter publication product reviews using the same controls and fields as the reviews UI
- `list_product_tags` _(read)_ — List and search publication product tags with assignment counts
- `list_products` _(read)_ — List products for a given publication with optional filtering and sorting
- `moderate_product_review` _(write)_ — Approve or reject a subscriber-submitted product review. Only the moderation status can be changed - reviews are never created or edited through this tool,…
- `save_product` _(destructive)_ — Create or update a product (a paid or free offering buyers can purchase). If product_id is provided, updates the existing product; otherwise creates a new one.…
- `save_product_coupon` _(write)_ — Create or update a product discount coupon. If product_coupon_id is provided, updates the existing coupon; otherwise creates a new one. Once created, a…
- `save_product_promotion_code` _(write)_ — Create a redeemable promotion code on a product coupon, or activate/deactivate an existing one. If product_promotion_code_id is provided, toggles the code's…
- `save_product_review_settings` _(write)_ — Update product review moderation and display settings for a publication. Lazy-creates the settings if this publication has none yet. Only the fields you pass…
- `save_product_tag` _(write)_ — Create or rename a product tag used to organize products. If product_tag_id is provided, renames the existing tag; otherwise creates a new one. Tag names are…
- `get_publication_settings` _(read)_ — Get the publication settings that save_publication_settings accepts. Only settings currently available to this publication are returned, and the document is…
- `list_publication_tags` _(read)_ — List the beehiiv publication-category names accepted by save_publication_settings' general_info.tags field.
- `save_publication_settings` _(destructive)_ — Partially update publication settings returned by get_publication_settings. Send only requested fields from its settings object. Omitted fields are unchanged;…
- `get_author` _(read)_ — Get an author's details by author ID
- `get_earnings` _(read)_ — Get a publication's revenue broken down by feature - ad network, boosts, paid subscriptions, and digital products - plus the combined total, over a time period…
- `get_engagements` _(read)_ — Get email engagement metrics (opens, clicks) for a publication over time, broken down by period.
- `get_publication` _(read)_ — Get a publication's profile and configuration. Members and admins also see subscriber tags. Admins also see each web domain, email domain, web redirect, and…
- `get_publication_stats` _(read)_ — Get a high-level overview of publication performance — active subscribers, engagement rates, subscriber growth, earnings, and top acquisition sources.
- `get_referral_program` _(read)_ — Get a publication's referral program details, including milestones and rewards
- `get_subscriber_growth` _(read)_ — Get day-by-day subscriber growth for a publication: new subscribers, unsubscribes, resubscribes, and net change per day. Net is subscribed minus unsubscribed…
- `get_subscriber_history` _(read)_ — Get the publication's active subscriber count over time, matching the values shown in the dashboard's subscriber growth chart. Use this for historical or trend…
- `get_tier` _(read)_ — Get a tier's details by tier ID
- `list_authors` _(read)_ — List authors for a given publication
- `list_publications` _(read)_ — List all publications the authenticated user has access to
- `list_tiers` _(read)_ — List tiers for a given publication with optional filtering by status
- `save_guest_author` _(write)_ — Create or update a guest author (publication-scoped byline). If guest_author_id is provided, updates the existing guest author; otherwise creates a new one.…
- `apply_to_paid_recommendation` _(write)_ — Apply to a paid recommendation offer, asking that publication for permission to recommend them to your subscribers in exchange for a payout per subscriber you…
- `discover_publications` _(read)_ — Search the publications you could recommend, the same surface as the discover page in the app. Returns public-safe fields only. Use this to find a…
- `get_recommendation_partner_insights` _(read)_ — Get engagement and spend insights for a publication's paid recommendation partners (publications you pay to recommend you), to identify which send…
- `list_recommendation_suggestions` _(read)_ — List AI-generated recommendation suggestions for a publication. Returns up to 4 high-quality publication suggestions that haven't been dismissed or already…
- `list_recommendations` _(read)_ — List a publication's recommendations, both free and paid. Defaults to outgoing recommendations (publications you recommend to your subscribers). Use direction…
- `review_paid_recommendation_application` _(destructive)_ — Accept or reject a pending application from a publication that wants to recommend you in exchange for a payout from your offer. Find application_id with…
- `save_paid_recommendation` _(destructive)_ — Pause, resume, or end an existing paid recommendation - a publication you are being paid to recommend to your subscribers. Find the recommendation_id with…
- `save_recommendation` _(destructive)_ — Create, restore, update, or archive a free recommendation - a publication you recommend to your subscribers. Use discover_publications or…
- `list_referral_rewards` _(read)_ — List rewards configured on a publication's referral program. Use reward IDs with save_referral_milestone.
- `save_referral_milestone` _(write)_ — Create or update a referral program milestone. Milestones define thresholds (e.g. 5 referrals) that trigger a reward email. Each milestone requires a reward —…
- `save_referral_program` _(write)_ — Update a publication's referral program settings. The referral program must already exist. Use get_referral_program to retrieve current settings. Only provided…
- `save_referral_reward` _(write)_ — Create or update a referral program reward. If reward_id is provided, updates the existing reward; otherwise creates a new one. When updating, only provided…
- `add_segment_to_newsletter_list` _(write)_ — Add every subscriber in a segment to a newsletter list. Runs in the background against the segment's current members. Poll `get_subscription` (with…
- `get_segment` _(read)_ — Retrieve detailed information about a segment
- `get_segment_schema` _(read)_ — Get the Segment DSL reference: available fields, operators, syntax, and examples.
- `list_segments` _(read)_ — List segments for a publication
- `recalculate_segment` _(write)_ — Trigger a recalculation of a dynamic or static segment to refresh its membership count and metrics. Recalculation runs in the background. Poll `get_segment`…
- `save_segment` _(write)_ — Create or update a subscriber segment. Call `get_segment_schema` first to learn available fields and syntax. If segment_id is provided, updates the existing…
- `list_signup_flows` _(read)_ — List signup flows for a publication. Each flow defines an ordered set of URLs that new subscribers step through. Returns the materialized steps with…
- `save_signup_flow` _(write)_ — Create or update a publication's signup flow - an ordered set of URLs that new subscribers step through. Omit `signup_flow_id` to create, where the first flow…
- `build_site_page` _(write)_ — Compose a single website page using the template-builder factory (tb) - deterministic, rule-validated output - and write it as that page's DRAFT content. The…
- `derive_brand_spec` _(read)_ — Derive a complete BrandSpec from this publication's own brand - its web theme colors, fonts, name, and logo - via the template-builder factory. When the user…
- `edit_page` _(destructive)_ — Change an existing website page's metadata - its name, visibility, paywall, SEO/social cards, and layout toggles. This is a partial patch: only the fields you…
- `get_content_gate` _(read)_ — Get the content gate settings for a page on a publication's website. Content gates hide content below the gate based on the visitor's subscription status.…
- `get_site_global` _(read)_ — Get one of a website's site globals (navbar, footer, login_modal, signup_modal). Reads the draft you are editing, or pass site_version_id from…
- `get_page` _(read)_ — Get a website page's metadata and customization. Read the page's body with get_page_content.
- `get_page_content` _(read)_ — On a website builder site, call it with just the page identifier: it returns an `editable` list of the nodes you may change, with the template value in `attrs`…
- `get_site` _(read)_ — Get a publication's website structure, content index, and configuration. Returns site metadata, SEO, social links, analytics pixels, settings, content (posts,…
- `learn_page_authoring` _(read)_ — For an advanced builder site. A website builder site has no node tree to write - it takes `overrides` on save_page_content and save_site_global, whose…
- `learn_page_metadata` _(read)_ — Reference for the page metadata accepted by `edit_page` - name, visibility, paywall, the SEO/social-card `metadata` object, and the layout `customization`…
- `learn_site_design` _(read)_ — Design intelligence for building beautiful beehiiv site pages - read overview first, then topic deep-dives; content is generated from the template-builder's…
- `list_page_versions` _(read)_ — List one page's body history, newest first. Address the page by `page_id`, `slug` or `page_type`, the same way edit_page and save_page_content do. Every…
- `list_pages` _(read)_ — List a publication's website pages (home, subscribe, custom pages, etc.) with their slugs, metadata, and publish state. Use get_page_content to read a single…
- `list_site_redirects` _(read)_ — List a publication's website redirects (old_path → new_path, status_code, redirect_type, wildcard, active). Redirects map old site paths to new ones. To…
- `list_site_templates` _(read)_ — List the sections, blocks and pages this publication has saved as reusable templates from its own site - the user's own library, separate from the beehiiv…
- `list_site_versions` _(read)_ — List a website's version history: the site-wide snapshots and saves that cover the navbar, footer, modals, routes and settings. Newest first. For a snapshot,…
- `list_sites` _(read)_ — List a publication's websites. The live one is the published site, the one visitors reach at the publication's domain; the rest are unpublished drafts nobody…
- `restore_version` _(destructive)_ — Roll a website back to an earlier version. Pass exactly one of `site_version_id` (from list_site_versions) or `page_version_id` (from list_page_versions). A…
- `save_content_gate` _(write)_ — Update the audience settings of an existing content gate on a publication's website page. Scope and limits: - Updates an existing gate only. save_page_content…
- `save_site_global` _(destructive)_ — On a website builder site the navbar, footer and subscribe form come from a preset, so there is no document to compose. Send `overrides` there - a patch keyed…
- `save_page` _(write)_ — Create a new custom website page on a publication's site. The page is created as a draft with an empty body; promotion/publish stays a human action via the…
- `save_page_content` _(destructive)_ — On a website builder site a page is assembled from a preset, so there is no body to compose. Send `overrides` there - a patch keyed by the node ids…
- `save_site_redirect` _(write)_ — Create or update a publication's website redirect, mapping an old site path to a new one. Omit `site_redirect_id` to create; pass it to update, where only the…
- `save_site_settings` _(write)_ — Set a website's builder-level settings. `get_site` returns the current values under `settings`, and only the settings you pass change.…
- `save_site_theme` _(destructive)_ — Set a website's theme tokens - the fonts, colors, borders and shadows the whole site renders from. Every page, the navbar, the footer, the modals and the post…
- `get_sponsorship_agreement_item` _(read)_ — Get full details for a sponsorship agreement item, including advertiser info, placement details, and scheduled date. Use after list_sponsorship_agreement_items…
- `get_sponsorship_product` _(read)_ — Get full details for a Direct Sponsorships product, including price, product type, booking message, and recurrence. Use after list_sponsorship_products, or…
- `list_sponsorship_agreement_items` _(read)_ — List sponsorship agreement items (scheduled ad placements) for a publication. Each item represents a single sponsored placement with its advertiser, placement…
- `list_sponsorship_products` _(read)_ — List Direct Sponsorships products (the ad formats/placements a publisher sells to advertisers, e.g. 'Newsletter Primary Sponsor') for a publication. Matches…
- `save_sponsorship_product` _(write)_ — Create or update a Direct Sponsorships product (the ad formats/placements a publisher sells to advertisers, e.g. 'Newsletter Primary Sponsor'). Matches the…
- `get_subscribe_form` _(read)_ — Get a subscribe form's settings, theme design tokens (a flat token map matching save_subscribe_form_theme's input), and custom field bindings. Returns…
- `get_subscribe_form_diff` _(read)_ — Compare a subscribe form's unpublished draft against its live theme. Lists every token that differs (live vs draft value) - i.e. exactly what publishing the…
- `learn_subscribe_form_authoring` _(read)_ — Reference for editing subscribe forms: the draft/publish workflow, allowed render and trigger values, trigger_config shapes, and the full theme token…
- `list_subscribe_forms` _(read)_ — List a publication's subscribe forms with summary metadata. Use get_subscribe_form for a form's full theme and custom fields.
- `save_subscribe_form` _(destructive)_ — Create a new subscribe form, or update an existing one's name, success behaviour, and display rules. Pass subscribe_form_id to update an existing form…
- `save_subscribe_form_theme` _(destructive)_ — Edit a subscribe form's theme design tokens. Always writes the DRAFT theme - changes are not live until the draft is published from the website editor. Pass…
- `get_subscription` _(read)_ — Get a subscription's details by subscription ID
- `get_subscription_batch` _(read)_ — Get full details for multiple subscriptions in one call — email, status, tags, tiers, custom fields, and per-subscriber engagement stats. Returns a…
- `list_custom_fields` _(read)_ — List custom fields for a given publication with optional filtering by kind
- `list_subscriber_activity` _(read)_ — List one subscriber's email activity across every post in the publication, most recent first. Each row gives the post, the event, when it happened, and for a…
- `list_subscriptions` _(read)_ — List subscriptions for a publication with optional filtering and pagination.
- `list_tags` _(read)_ — List subscriber tags for a given publication
- `save_custom_field` _(write)_ — Create or update a publication-level custom field used to capture extra data on subscribers. If custom_field_id is provided, updates the existing field;…
- `save_subscriber_tag` _(write)_ — Create or rename a subscriber tag. If tag_id is provided, updates the existing tag; otherwise creates a new one. When creating, publication_id and name are…
- `get_survey` _(read)_ — Get a survey's details including questions, options, and aggregate response data
- `list_survey_responses` _(read)_ — List individual survey responses with per-question answers
- `list_surveys` _(read)_ — List surveys for a given publication
- `save_survey` _(destructive)_ — Create or update a survey (form). If survey_id is provided, updates the existing survey; otherwise creates a new one. When creating, title is required. To…
- `save_survey_question` _(write)_ — Add or update a question on a survey. Use `list_custom_fields` to find valid custom_field_id values before adding questions. For multiple_choice or dropdown…
- `save_tier` _(write)_ — Create or update a paid tier's metadata (name, description, redirect URL, gifting). If tier_id is provided, updates the existing tier; otherwise creates a new…
- `get_website_analytics` _(read)_ — Get the high-level website analytics overview for a publication.
- `get_website_analytics_breakdown` _(read)_ — Get a ranked website analytics breakdown grouped by dimension. The `data` block is keyed by the underlying metric (e.g. `data.page_views` or `data.sessions`).
- `get_website_analytics_conditions_schema` _(read)_ — Get the schema for website analytics conditions, used to build the conditions parameter for website analytics tools.
- `get_current_user` _(read)_ — Get identity and access context for the authenticated user
- `get_skill` _(read)_ — Get an agent skill with its instructions, such as brand guidelines.
- `get_workspace` _(read)_ — Get details about the current workspace, including whether beehiiv has disabled its sending or disabled or frozen its paid recommendations
- `list_skills` _(read)_ — List the workspace's agent skills: saved instructions beehiiv's agent loads on demand, such as brand guidelines or house style. Workspace skills are shared…
- `save_current_user` _(write)_ — Update the authenticated user's own author profile: name, bio, avatar and social links. This writes the profile of the person whose credentials this session…
- `save_skill` _(destructive)_ — Create or update an agent skill: saved instructions beehiiv's agent loads when relevant, such as brand guidelines (palette, fonts, logo rules, voice, do and…

---

## Connect

Gateway URL: https://gateway.mewcp.com/personal/mcp

Every request carries one header:

    Authorization: Bearer <API_KEY>

Replace `API_KEY` with your own key from the dashboard (Developer).

## Apps

### Claude Desktop

Mac & Windows app

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://gateway.mewcp.com/personal/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open Claude Desktop → Settings → Developer → "Edit Config"
2. Paste the snippet inside the outer { } of the config file (merge with your existing "mcpServers" section if you have one)
3. Save the file, then quit Claude Desktop completely and reopen it
4. Start a new conversation — your tool will be available

### VS Code

Copilot / Cline

- Command Palette → "MCP: Open User Configuration" (opens mcp.json). For one project only, use .vscode/mcp.json instead.

```json
{
  "mcp.servers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have a "servers" section in your mcp.json? Just add the server entry inside it.

1. Open VS Code → Command Palette (Cmd+Shift+P / Ctrl+Shift+P)
2. Run "MCP: Open User Configuration" to open your mcp.json
3. Paste the snippet and save
4. Start the server when prompted (or from the MCP servers view) and use it in Copilot Chat

### Cursor

AI-first editor

- macOS: `~/.cursor/mcp.json`
- Windows: `%USERPROFILE%\.cursor\mcp.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your mcp.json? Just add the server entry inside it.

1. Open Cursor → Settings → Cursor Settings → MCP
2. Click "Add new global MCP server"
3. Paste the snippet and save
4. Restart Cursor

### Codex

OpenAI's CLI agent

- Add the snippet to your Codex MCP config or your standard MCP config file for the CLI tool you use.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Codex generally reads a standard MCP server block, so you can add this alongside your other configured servers.

1. Open your Codex MCP config or project-level config file
2. Paste the MewCP server block inside the config JSON/TOML structure your tool expects
3. Save the file and restart Codex
4. Verify the tool is available inside a fresh session

### Claude Code

Anthropic's CLI agent

- ~/.claude.json (user scope) or .mcp.json in your project root — create it if it doesn't exist. Or skip the file and use the CLI command below.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open ~/.claude.json (or .mcp.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file and start (or restart) Claude Code
4. Or skip the file entirely and run the CLI command below instead

### OpenCode

Open-source terminal agent

- ~/.config/opencode/opencode.json (global) or opencode.json in your project root — create it if it doesn't exist.

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mewcp": {
      "type": "remote",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcp" section in your opencode.json? Just add the server entry inside it.

1. Open ~/.config/opencode/opencode.json (or opencode.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and start (or restart) OpenCode

### OpenClaw

Self-hosted agent gateway

- ~/.openclaw/openclaw.json — create it if it doesn't exist.

```json
{
  "mcp": {
    "servers": {
      "mewcp": {
        "transport": "streamable-http",
        "url": "https://gateway.mewcp.com/personal/mcp",
        "enabled": true,
        "headers": {
          "Authorization": "Bearer API_KEY"
        }
      }
    }
  }
}
```

Already have an "mcp" section in your openclaw.json? Just add the server entry inside "servers".

1. Open ~/.openclaw/openclaw.json in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and restart OpenClaw

### Antigravity

Google's agentic IDE

- ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — create it if it doesn't exist.

```json
{
  "mcpServers": {
    "mewcp": {
      "serverUrl": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it. Remote servers must use the "serverUrl" field — the legacy "url"/"httpUrl" fields aren't supported.

1. In the editor's agent side panel, click "…" → "MCP Servers" → "Manage MCP Servers" → "View raw config" (Antigravity CLI: type /mcp instead to open the Interactive MCP Manager)
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file — the server connects automatically

### Hermes

Nous Research's CLI agent

- config.yaml in your Hermes config directory (~/.hermes) — add this under a top-level "mcp_servers:" key.

```yaml
mcp_servers:
  mewcp:
    url: "https://gateway.mewcp.com/personal/mcp"
    headers:
      Authorization: "Bearer API_KEY"
```

Already have an "mcp_servers" section in your config.yaml? Just add the server entry inside it.

1. Open config.yaml in your Hermes config directory
2. Paste the snippet under the top-level "mcp_servers:" key (merge with existing entries if you have any)
3. Save the file, then run /reload-mcp in Hermes (or start a fresh session)
4. Ask Hermes "Tell me which MCP-backed tools are available right now" to confirm it connected

### DeepSeek Harness

DeepSeek's agent harness

- cordis.yml in your DSH project — or the patch file you mount plugins from.

```yaml
- id: mcp-mewcp
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: mewcp
    transport: streamable-http
    url: https://gateway.mewcp.com/personal/mcp
    headers:
      Authorization: "Bearer API_KEY"
```

One plugin instance = one MCP server. Add this entry to your plugin list; don't nest it inside another entry.

1. Open cordis.yml (or your patch file) in your DSH project
2. Paste the entry into your plugin list, keeping the leading dash and indentation
3. Restart DSH (or let HMR reload) — tools register as mcp__mewcp__<tool_name>
4. Verify with: dsh web --dump-config | grep -A3 mcp

## SDKs

### Python

fastmcp client

```python
import asyncio
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport

SERVER_URL = "https://gateway.mewcp.com/personal/mcp"
API_KEY = "API_KEY"

transport = StreamableHttpTransport(
    url=SERVER_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}",
    }
)

async def main():
    client = Client(transport)
    async with client:
        tools = await client.list_tools()
        print(tools)

asyncio.run(main())
```

1. Install fastmcp: pip install fastmcp
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run your script

### TypeScript

MCP SDK

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const SERVER_URL = "https://gateway.mewcp.com/personal/mcp";
const API_KEY = "API_KEY";

const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), {
  requestInit: {
    headers: {
      Authorization: `Bearer ${API_KEY}`,
    },
  },
});

const client = new Client({ name: "mewcp-client", version: "1.0.0" });
await client.connect(transport);

const tools = await client.listTools();
console.log(tools.tools.map((t) => t.name));
```

1. Install: npm install @modelcontextprotocol/sdk
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run with Node 18+ as an ES module (e.g. npx tsx script.ts)