MCP tools
Endpoint https://hive.lnkbase.com/mcp · see the MCP guide to connect Claude or ChatGPT.
list_posts — List posts
List posts (newest first) with status and headline stats.
{
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "draft|scheduled|published|archived"
},
"limit": {
"type": "integer",
"description": "Max results (default 20, max 100)"
},
"query": {
"type": "string",
"description": "Search in titles"
}
},
"required": [],
"additionalProperties": false
}get_post — Get post
Get a post: metadata, content as Markdown-like text, and engagement stats.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Post id or slug"
}
},
"required": [
"id"
],
"additionalProperties": false
}draft_post — Draft a post
Create a draft post from Markdown (headings, lists, quotes, code fences, images, tables; a line "--- paywall ---" inserts a paywall break). Optionally start from a template.
{
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Post title"
},
"subtitle": {
"type": "string",
"description": "Subtitle"
},
"markdown": {
"type": "string",
"description": "Body in Markdown"
},
"template_id": {
"type": "string",
"description": "Template id to start from"
},
"email_subject": {
"type": "string",
"description": "Email subject (defaults to title)"
},
"preview_text": {
"type": "string",
"description": "Inbox preview text"
},
"audience": {
"type": "string",
"description": "all|free|premium"
},
"platform": {
"type": "string",
"description": "email|web|both"
}
},
"required": [
"title"
],
"additionalProperties": false
}update_post — Update a post
Edit a post: replace the body (markdown), append/prepend markdown, or change title/subtitle/subject/preview/audience.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Post id or slug"
},
"title": {
"type": "string",
"description": "New title"
},
"subtitle": {
"type": "string",
"description": ""
},
"email_subject": {
"type": "string",
"description": ""
},
"preview_text": {
"type": "string",
"description": ""
},
"audience": {
"type": "string",
"description": "all|free|premium"
},
"markdown": {
"type": "string",
"description": "Replace the whole body"
},
"append_markdown": {
"type": "string",
"description": "Add to the end"
},
"prepend_markdown": {
"type": "string",
"description": "Add to the beginning"
}
},
"required": [
"id"
],
"additionalProperties": false
}set_ab_test — Set A/B or multivariate test
Configure an A/B test on a draft or scheduled post: either subjects (2-5 subject lines) or variants (2-4 combinations of subject, preview_text, from_name and content "a" = main / "b" = Variant B content, set with alt_markdown). A sample receives the variants; the winner (by opens or clicks) goes to everyone else. send_timing optionally delivers by send-time optimization ({"mode":"sto"}) or local time zone ({"mode":"timezone","local_time":"09:00"}).
{
"type": "object",
"properties": {
"post_id": {
"type": "string",
"description": "Post id or slug"
},
"subjects": {
"type": "array",
"description": "2-5 subject lines",
"items": {
"type": "string"
}
},
"variants": {
"type": "array",
"description": "2-4 variants {subject?, preview_text?, from_name?, content: a|b}",
"items": {
"type": "object"
}
},
"alt_markdown": {
"type": "string",
"description": "Variant B content (Markdown)"
},
"sample_pct": {
"type": "integer",
"description": "Percent of audience in the test (2-50, default 20)"
},
"wait_minutes": {
"type": "integer",
"description": "Minutes before picking the winner (default 60)"
},
"metric": {
"type": "string",
"description": "opens|clicks"
},
"send_timing": {
"type": "object",
"description": "Optional delivery timing",
"additionalProperties": true
}
},
"required": [
"post_id"
],
"additionalProperties": false
}get_stats — Get stats
Answer questions like "what was my open rate / CTR / revenue last month?". Returns numbers plus a plain-English summary. Pass post_id for a single post.
{
"type": "object",
"properties": {
"days": {
"type": "integer",
"description": "Period in days (default 30)"
},
"post_id": {
"type": "string",
"description": "Optional post id or slug"
}
},
"required": [],
"additionalProperties": false
}compare_posts — Compare posts
Compare performance across many posts in one request (open rate, CTR, clicks, unsubscribes, web views), sorted.
{
"type": "object",
"properties": {
"post_ids": {
"type": "array",
"description": "Specific post ids (optional)",
"items": {
"type": "string"
}
},
"limit": {
"type": "integer",
"description": "Most recent N published posts when post_ids is omitted (default 20, max 100)"
},
"sort_by": {
"type": "string",
"description": "open_rate|click_rate|unique_clicks|unsubscribes|web_views|published_at"
}
},
"required": [],
"additionalProperties": false
}deliverability_by_provider — Deliverability by mailbox provider
Delivery, bounce, complaint, open and click rates per mailbox provider (Gmail, Outlook, Yahoo, Apple…) for a post.
{
"type": "object",
"properties": {
"post_id": {
"type": "string",
"description": "Post id or slug"
}
},
"required": [
"post_id"
],
"additionalProperties": false
}reports — Growth & earnings reports
Subscriber growth report (daily new/unsubscribed + acquisition sources) or earnings report (orders by day/kind, MRR, ads/boost earnings).
{
"type": "object",
"properties": {
"report": {
"type": "string",
"description": "growth|earnings"
},
"days": {
"type": "integer",
"description": "Period in days (default 30)"
}
},
"required": [
"report"
],
"additionalProperties": false
}get_subscriber — Look up a subscriber
A subscriber's full profile, tags, acquisition source, engagement score, per-post engagement history and recent activity.
{
"type": "object",
"properties": {
"email_or_id": {
"type": "string",
"description": "Email address or subscriber id"
}
},
"required": [
"email_or_id"
],
"additionalProperties": false
}subscriber_intelligence — Subscriber intelligence
action: subscriber {email_or_id} (value score, lifetime value, purchase likelihood, churn risk, public signals) | top {sort?: value|clv|purchase|churn, limit?} | anomalies (unusual changes in the last 24h vs the previous 14 days) | next_actions (data-driven suggested next steps).
{
"type": "object",
"properties": {
"action": {
"type": "string",
"description": "subscriber | top | anomalies | next_actions"
},
"email_or_id": {
"type": "string",
"description": "For action=subscriber"
},
"sort": {
"type": "string",
"description": "value|clv|purchase|churn"
},
"limit": {
"type": "integer",
"description": "Max results (default 20)"
}
},
"required": [
"action"
],
"additionalProperties": false
}add_subscriber — Add a subscriber
Subscribe an email address (validated; double opt-in respected) with optional tags.
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Email"
},
"name": {
"type": "string",
"description": "Name"
},
"tags": {
"type": "array",
"description": "Tags to add",
"items": {
"type": "string"
}
}
},
"required": [
"email"
],
"additionalProperties": false
}list_segments — List segments
List audience segments with subscriber counts.
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}create_segment_from_description — Build a segment
Build a segment from a plain-English description. Translate the description into rules: {"op":"and"|"or","rules":[{"field","cmp","value"} | nested group]}. Fields (comparators): email (contains|not_contains|equals|ends_with); name (contains|equals|is_empty|not_empty); status (eq|neq; values: active,pending,unsubscribed,bounced,complained); tier (eq|neq; values: free,premium); tier_id (eq|neq); subscription_status (eq|neq; values: trialing,active,paused,past_due,canceled); trial (is_true|is_false); source (eq|neq; values: website,form,magic_link,import,api,referral,recommendation,boost,manual,event,product,linkinbio); source_detail (equals|contains); utm_source (equals|contains|is_empty|not_empty); utm_medium (equals|contains|is_empty|not_empty); utm_campaign (equals|contains|is_empty|not_empty); country (equals|neq); created_at (within_days|older_than_days|before|after); engagement (gt|lt|eq); open_count (gt|lt|eq); click_count (gt|lt|eq); referral_count (gt|lt|eq); last_open_at (within_days|not_within_days|never); last_click_at (within_days|not_within_days|never); tag (has|not_has); custom (equals|neq|contains|gt|lt|exists|not_exists); opened_post (yes|no); clicked_post (yes|no); clicked_url (contains); automation (started|not_started|completed|active); segment (in|not_in); list (in|not_in); poll (answered|chose|not_answered); survey (responded|not_responded|answer_equals); purchased (yes|no|any); event_registered (yes|no); community_member (is_true|is_false); condition_set (matches|not_matches); ext_purchased (contains|not_contains); ext_platform (eq|neq; values: shopify,woocommerce,stripe); ext_total_spent (gt|lt|eq); ext_orders_count (gt|lt|eq); ext_last_order (within_days|not_within_days|never); cart_abandoned (is_true|is_false); job_title (contains|equals|is_empty|not_empty); company (contains|equals|is_empty|not_empty); has_social (is_true|is_false); business_email (is_true|is_false); value_score (gt|lt|eq); value_percentile (gt|lt); clv (gt|lt); purchase_likelihood (eq|neq; values: high,medium,low); churn_risk (eq|neq; values: high,medium,low). Notes: days-based comparators take a number; tag takes the tag name; custom takes {"key","value"}; poll takes {"poll_id","option_id"}; segment/list/automation/post/product/event take an id. Set dry_run to preview the count without saving.
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Segment name"
},
"description": {
"type": "string",
"description": "The plain-English description"
},
"rules": {
"type": "object",
"description": "Rule group JSON",
"additionalProperties": true
},
"kind": {
"type": "string",
"description": "dynamic (default) | static"
},
"dry_run": {
"type": "boolean",
"description": "Only count matches"
}
},
"required": [
"name",
"rules"
],
"additionalProperties": false
}tag_subscriber — Tag a subscriber
Add tags to a subscriber.
{
"type": "object",
"properties": {
"email_or_id": {
"type": "string",
"description": "Email or id"
},
"tags": {
"type": "array",
"description": "Tags",
"items": {
"type": "string"
}
}
},
"required": [
"email_or_id",
"tags"
],
"additionalProperties": false
}list_automations — List automations
List automations with trigger, status, enrollment counts and whether unpublished draft changes exist.
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}create_automation — Create an automation
Create an automation (saved as a draft; activate=true publishes it and turns it on). trigger = {"type", "config"}; types: signup (Subscriber signs up; config: sources,source_details); confirmed (Subscriber confirms email); welcome (Welcome (new subscriber, after confirmation)); tag_added (Tag is added; config: tag); field_updated (Custom field is updated; config: key); list_subscribed (Joins a newsletter list; config: list_id); upgraded (Upgrades to paid; config: tier_id); downgraded (Downgrades / cancels); purchase (Purchases a product; config: product_id); event_registered (Registers for an event; config: event_id); survey_submitted (Submits a survey; config: survey_id); poll_voted (Votes in a poll; config: poll_id); email_opened (Opens an email; config: post_id); link_clicked (Clicks a link; config: post_id,url_contains); referral_milestone (Reaches a referral milestone); segment_entered (Enters a segment; config: segment_id); date_field (Date in custom field (birthday, renewal…); config: key,offset_days); inactive (Becomes inactive (no opens for N days); config: days); api (Enrolled via API or manually); external_purchase (Buys in your store (Shopify / WooCommerce / Stripe); config: platform,product_contains,min_total); cart_abandoned (Abandons a cart (Shopify / WooCommerce); config: delay_hours,min_value); webhook (Incoming webhook (Calendly, Typeform, Thinkific, Kajabi, Zapier…); config: email_path,name_path,tags,field_map,double_opt_in). steps = [{"id","type","config","yes"?,"no"?}]; step types: send_email=Send email, delay=Wait for a time, wait_until=Wait until…, condition=If / else branch, ab_split=Random split, add_tag=Add tag, remove_tag=Remove tag, update_field=Update custom field, add_to_list=Add to list, remove_from_list=Remove from list, webhook=Call webhook, enroll=Enroll in another automation, grant_premium=Grant premium access, notify=Notify team, unsubscribe=Unsubscribe, exit=Exit automation. Configs: send_email {subject, preview_text, markdown (converted) or doc}, delay {amount, unit: minutes|hours|days|weeks}, condition {rules} with yes/no branches, add_tag {tags}, update_field {key,value}, webhook {url, method}, wait_until {mode: datetime|weekday_time|condition, ...}.
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name"
},
"description": {
"type": "string",
"description": ""
},
"trigger": {
"type": "object",
"description": "Trigger",
"additionalProperties": true
},
"triggers": {
"type": "array",
"description": "Several entry points [{type, config}] — subscribers enter when any matches (use instead of trigger)",
"items": {
"type": "object"
}
},
"template": {
"type": "string",
"description": "Optional template key from list_automation_templates; trigger/steps override it"
},
"steps": {
"type": "array",
"description": "Steps",
"items": {
"type": "object"
}
},
"allow_reentry": {
"type": "boolean",
"description": "Let subscribers enter more than once"
},
"activate": {
"type": "boolean",
"description": "Publish and turn on immediately"
}
},
"required": [],
"additionalProperties": false
}list_automation_templates — Automation templates
List the 45-template automation library (welcome series, lead magnets, courses, launches, cart abandonment, win-back, webinars, paid trials, churn save, birthdays, Calendly/Typeform/Thinkific webhooks…). Pass a key as `template` to create_automation.
{
"type": "object",
"properties": {
"category": {
"type": "string",
"description": "Optional category filter"
}
},
"required": [],
"additionalProperties": false
}update_automation — Edit an automation
Edit an automation. Trigger/step changes go to a draft version while the live one keeps running; publish=true makes them live (running journeys continue on the new version). status: active (publishes the draft and turns it on) | paused.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Automation id"
},
"name": {
"type": "string",
"description": ""
},
"description": {
"type": "string",
"description": ""
},
"trigger": {
"type": "object",
"description": "Trigger",
"additionalProperties": true
},
"triggers": {
"type": "array",
"description": "Several entry points [{type, config}] (OR)",
"items": {
"type": "object"
}
},
"steps": {
"type": "array",
"description": "Steps",
"items": {
"type": "object"
}
},
"allow_reentry": {
"type": "boolean"
},
"status": {
"type": "string",
"enum": [
"active",
"paused"
]
},
"publish": {
"type": "boolean",
"description": "Publish draft changes"
}
},
"required": [
"id"
],
"additionalProperties": false
}enroll_subscriber — Enroll in automation
Enroll a subscriber into an active automation.
{
"type": "object",
"properties": {
"automation_id": {
"type": "string",
"description": "Automation id"
},
"email_or_id": {
"type": "string",
"description": "Subscriber"
}
},
"required": [
"automation_id",
"email_or_id"
],
"additionalProperties": false
}generate_image — Generate an AI image
Generate an image from a prompt and save it to the media library. Returns the image URL to use in posts.
{
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "Image description"
}
},
"required": [
"prompt"
],
"additionalProperties": false
}manage_website — Website pages, redirects & SEO
Manage the website. action: list_pages | get_page | create_page {title, slug?, markdown|html|sections, status?, seo?, paywall?} | update_page {page_id, ...} | list_redirects | create_redirect {from_path, to_url, code?} | delete_redirect {redirect_id} | get_seo | update_seo {robots_txt?, block_ai_crawlers?, blocked_crawlers?, google_news?, ga_measurement_id?}.
{
"type": "object",
"properties": {
"action": {
"type": "string",
"description": "Action name"
},
"page_id": {
"type": "string",
"description": ""
},
"title": {
"type": "string",
"description": ""
},
"slug": {
"type": "string",
"description": ""
},
"markdown": {
"type": "string",
"description": ""
},
"html": {
"type": "string",
"description": ""
},
"sections": {
"type": "array",
"description": "Builder sections",
"items": {
"type": "object"
}
},
"status": {
"type": "string",
"description": "draft|published"
},
"seo": {
"type": "object",
"description": "{title, description, og_image, noindex}",
"additionalProperties": true
},
"paywall": {
"type": "string",
"description": "none|subscribers|premium"
},
"show_in_nav": {
"type": "boolean"
},
"from_path": {
"type": "string",
"description": ""
},
"to_url": {
"type": "string",
"description": ""
},
"code": {
"type": "integer",
"description": "301|302"
},
"redirect_id": {
"type": "string",
"description": ""
},
"robots_txt": {
"type": "string",
"description": ""
},
"block_ai_crawlers": {
"type": "boolean"
},
"blocked_crawlers": {
"type": "array",
"description": "",
"items": {
"type": "string"
}
},
"google_news": {
"type": "boolean"
},
"ga_measurement_id": {
"type": "string",
"description": ""
}
},
"required": [
"action"
],
"additionalProperties": false
}community — Community posts & DMs
Read and reply in the community. action: list_posts {channel?, limit?} | get_post {post_id} (with comments) | reply_post {post_id, body} | list_dms (latest conversations) | get_dm {subscriber_id} | reply_dm {subscriber_id, body}.
{
"type": "object",
"properties": {
"action": {
"type": "string",
"description": ""
},
"channel": {
"type": "string",
"description": "Channel slug"
},
"post_id": {
"type": "string",
"description": ""
},
"subscriber_id": {
"type": "string",
"description": ""
},
"body": {
"type": "string",
"description": "Reply text"
},
"limit": {
"type": "integer",
"description": ""
}
},
"required": [
"action"
],
"additionalProperties": false
}ads — Ad offers & revenue
action: list_opportunities {status?: available|accepted|declined|placed|completed} | revenue_report {days?} (per placement and per post, bot clicks filtered).
{
"type": "object",
"properties": {
"action": {
"type": "string",
"description": ""
},
"status": {
"type": "string",
"description": ""
},
"days": {
"type": "integer",
"description": ""
}
},
"required": [
"action"
],
"additionalProperties": false
}podcasts — Podcast shows & episodes
Manage podcast shows and episodes. Actions: list_shows | create_show {title, description?, author?, owner_email?, cover_url?, language?, category? ("Technology" or "Business|Marketing"), explicit?, kind?: episodic|serial, access?: public|premium|both, copyright?} | update_show {podcast_id, …same fields} list_episodes {podcast_id, status?} | create_episode {podcast_id, title, description?, audio_url?, season?, number?, episode_type?: full|trailer|bonus, premium?, explicit?, image_url?, transcript?, status?: draft|published|scheduled, publish_at? (ISO)} update_episode {episode_id, …episode fields} | archive_episode {episode_id} (removed from feeds, restorable) | unarchive_episode {episode_id} (back to draft) | delete_episode {episode_id} (permanent, removes audio + download stats). Publishing or scheduling needs audio (audio_url, or a file uploaded in the dashboard). publish_at in the future schedules; in the past publishes.
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"list_shows",
"create_show",
"update_show",
"list_episodes",
"create_episode",
"update_episode",
"archive_episode",
"unarchive_episode",
"delete_episode"
]
},
"podcast_id": {
"type": "string",
"description": "Show id"
},
"episode_id": {
"type": "string",
"description": "Episode id"
},
"title": {
"type": "string",
"description": ""
},
"description": {
"type": "string",
"description": "Show description (plain text) or episode show notes (HTML allowed)"
},
"author": {
"type": "string",
"description": "Show author"
},
"owner_email": {
"type": "string",
"description": "Show owner email (Apple/Spotify verification)"
},
"cover_url": {
"type": "string",
"description": "Show cover art URL (3000×3000)"
},
"language": {
"type": "string",
"description": "e.g. en"
},
"category": {
"type": "string",
"description": "Apple category, optionally \"Category|Subcategory\""
},
"kind": {
"type": "string",
"enum": [
"episodic",
"serial"
]
},
"access": {
"type": "string",
"enum": [
"public",
"premium",
"both"
]
},
"copyright": {
"type": "string",
"description": ""
},
"audio_url": {
"type": "string",
"description": "Public audio file URL"
},
"season": {
"type": "integer",
"description": ""
},
"number": {
"type": "integer",
"description": ""
},
"episode_type": {
"type": "string",
"enum": [
"full",
"trailer",
"bonus"
]
},
"premium": {
"type": "boolean",
"description": "Episode only for paid subscribers"
},
"explicit": {
"type": "boolean"
},
"image_url": {
"type": "string",
"description": "Episode artwork URL"
},
"transcript": {
"type": "string",
"description": "Plain-text transcript"
},
"status": {
"type": "string",
"enum": [
"draft",
"published",
"scheduled",
"archived"
]
},
"publish_at": {
"type": "string",
"description": "ISO date-time"
}
},
"required": [
"action"
],
"additionalProperties": false
}products — Digital products & promo codes
Manage digital products and promo codes. Promo codes (a.k.a. coupons/offers — one concept in OpenHive) discount paid subscriptions, products or event tickets; readers enter them at checkout or use the share link (?code=…). Actions: list | get_product {product_id} | create_product {name, price (USD, 0 = free lead magnet), kind?, description?, link_url?, content?, status?} | update_product {product_id, name?, price?, kind?, description?, link_url?, content?, status?: active|draft|archived} | archive_product {product_id} (hidden from the shop, buyers keep access) | list_promo_codes {active_only?} | create_promo_code {code, percent_off? | amount_off (USD)?, applies_to?: all|subscription|product|event, target_id?, duration?: once|repeating|forever, duration_months?, max_redemptions?, expires_at? (ISO), name?} | update_promo_code {code or promo_code_id, active?, name?, max_redemptions?, expires_at? (ISO or null)} | delete_promo_code {code or promo_code_id}. create_coupon is accepted as an alias of create_promo_code.
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"list",
"get_product",
"create_product",
"update_product",
"archive_product",
"list_promo_codes",
"create_promo_code",
"create_coupon",
"update_promo_code",
"delete_promo_code"
]
},
"product_id": {
"type": "string",
"description": "Product id"
},
"name": {
"type": "string",
"description": "Product name, or promo code label"
},
"price": {
"type": "number",
"description": "USD"
},
"kind": {
"type": "string",
"enum": [
"download",
"link",
"guide",
"template",
"ebook",
"membership",
"coaching"
]
},
"description": {
"type": "string",
"description": ""
},
"link_url": {
"type": "string",
"description": "For link products"
},
"content": {
"type": "string",
"description": "Guide body (HTML or text)"
},
"status": {
"type": "string",
"enum": [
"active",
"draft",
"archived"
]
},
"code": {
"type": "string",
"description": "Promo code, e.g. SPRING25"
},
"promo_code_id": {
"type": "string",
"description": "Promo code id"
},
"percent_off": {
"type": "integer",
"description": "0-100"
},
"amount_off": {
"type": "number",
"description": "USD off (when not using percent_off)"
},
"applies_to": {
"type": "string",
"enum": [
"all",
"subscription",
"product",
"event"
]
},
"target_id": {
"type": "string",
"description": "Tier / product / event id the code is limited to"
},
"duration": {
"type": "string",
"enum": [
"once",
"repeating",
"forever"
],
"description": "Subscriptions: how long the discount applies"
},
"duration_months": {
"type": "integer",
"description": "For duration=repeating"
},
"max_redemptions": {
"type": [
"integer",
"null"
],
"description": "null = unlimited"
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "ISO date; null = never"
},
"active": {
"type": "boolean"
},
"active_only": {
"type": "boolean"
}
},
"required": [
"action"
],
"additionalProperties": false
}send_transactional — Send a transactional email
Send one transactional email (receipt, password reset, notification) to a single recipient, from a saved template (template_id = id or slug) or subject + markdown/html/text. merge_vars fill {{key}} / {{nested.key}} tags. Does not use the newsletter allowance; capped per day. Use idempotency_key to make retries safe.
{
"type": "object",
"properties": {
"to": {
"type": "string",
"description": "Recipient email"
},
"template_id": {
"type": "string",
"description": "Template id or slug"
},
"subject": {
"type": "string",
"description": "Subject (required without a template)"
},
"markdown": {
"type": "string",
"description": "Markdown body"
},
"html": {
"type": "string",
"description": "HTML body"
},
"text": {
"type": "string",
"description": "Plain-text body"
},
"merge_vars": {
"type": "object",
"description": "Merge variables",
"additionalProperties": true
},
"reply_to": {
"type": "string",
"description": "Reply-To address"
},
"tags": {
"type": "array",
"description": "Tags for the message log",
"items": {
"type": "string"
}
},
"idempotency_key": {
"type": "string",
"description": "Repeat-safe key"
},
"track": {
"type": "boolean",
"description": "Track opens and clicks"
}
},
"required": [
"to"
],
"additionalProperties": false
}snippets — Reusable content snippets
Manage reusable content blocks (signature, sponsor banner, footer CTA…). action: list | get {snippet_id} | create {name, markdown | blocks, description?} | update {snippet_id, name?, markdown? | blocks?, description?} | delete {snippet_id}. To use one in a post, add the block {"type":"snippet","data":{"snippet_id":"…"}} (synced: later snippet edits show up everywhere) or copy its blocks.
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"list",
"get",
"create",
"update",
"delete"
]
},
"snippet_id": {
"type": "string",
"description": "Snippet id"
},
"name": {
"type": "string",
"description": "Snippet name"
},
"description": {
"type": "string",
"description": ""
},
"markdown": {
"type": "string",
"description": "Content in Markdown"
},
"blocks": {
"type": "array",
"description": "Editor blocks (alternative to markdown)",
"items": {
"type": "object"
}
}
},
"required": [
"action"
],
"additionalProperties": false
}create_coded_template — Create a coded (HTML) template
Create a custom-coded email template from a full HTML document. Scripts/unsafe attributes are removed; merge tags work ({{subscriber.first_name|there}}, {{publication.name}}); {{unsubscribe_url}} is required and added automatically when missing. Posts created from it are sent exactly as written (links tracked).
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Template name"
},
"description": {
"type": "string",
"description": ""
},
"html": {
"type": "string",
"description": "Full HTML email document"
}
},
"required": [
"name",
"html"
],
"additionalProperties": false
}check_subject_line — Check a subject line
Score an email subject line 0-100 with advice: length (30-50 chars), words, preview text, spam-trigger words, ALL CAPS / !!!, emoji count, personalization merge tag, question/number. Also returns the publication’s top past subject lines by open rate.
{
"type": "object",
"properties": {
"subject": {
"type": "string",
"description": "Subject line"
},
"preview_text": {
"type": "string",
"description": "Preview text (optional)"
}
},
"required": [
"subject"
],
"additionalProperties": false
}search_docs — Search OpenHive docs
Search the OpenHive documentation (setup, deploy, API, MCP, deliverability, support) without leaving the chat.
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "What to look for"
}
},
"required": [
"query"
],
"additionalProperties": false
}