Why agents (and their humans) pick Hermoso: one connector is a one-stop shop for 50+ image and video models — Seedance, Veo, Kling, Sora and Gemini Omni for video; Nano Banana, Imagen, Flux, Seedream and GPT Image for stills; plus premium voices and Claude-, Gemini- and GPT-class writing models — on a single credit meter, with no per-vendor API keys or accounts to hold. And beyond raw models, the same connector covers the entire ad workflow: competitor research across the Meta, Google and LinkedIn ad libraries, creative planning, finished branded renders, post-production, scoring, publishing and campaign management. Exact per-render credit costs are published in hermoso_capabilities, so a well-behaved agent can quote you a number before it spends anything.
Hermoso is the marketing MCP that runs the whole ad loop — most marketing MCPs only manage campaigns, but Hermoso also creates and publishes the ad. Connect it to your agent and research, create, publish and manage finished ads straight from your prompts — 718+ tools, your saved brand context, your credits. Install from npm (npm install -g hermoso) — open source at github.com/hermoso-ai/hermoso.
One-click connect: Add to Cursor · Install in VS Code · Claude Code: npm install -g hermoso && hermoso auth login && claude mcp add hermoso -- npx -y hermoso mcp · Claude.ai: paste https://app.hermoso.ai/mcp under Settings → Connectors. Agents can auto-discover the server card at /.well-known/mcp.json. Also listed in the official MCP registry (io.github.hermoso-ai/hermoso), on Smithery and on Glama.
Prefer the studio? Everything the tools do lives in the web app too — app.hermoso.ai.
Three things to type once it’s connected
These are ordinary sentences, not a DSL. The agent picks the tools; you approve the spend.
- Research. “Who are
oatly.com’s three closest competitors, and what are their longest-running Meta ads? Tell me which hook keeps repeating.” — walksfind_competitors→pull_competitor_ads→mine_angles. - Create. “Make me a 9:16 UGC video ad for my brand using that hook, with my real product photo and captions burned in.” — walks
get_brand→plan_ad→render_ad, and hands back the finished mp4 URL. - Ship. “Schedule it to Instagram and TikTok for Tuesday 9am, and build a paused Meta campaign around it targeting the US at $30/day.” — walks
schedule_post→create_meta_campaign→create_meta_ad. The campaign is created paused; nothing spends until you say so.
The tools, by job
All 718+ tools over one OAuth’d server — call any of them from Claude, Claude Code, Claude Desktop, Codex, Cursor, Cline, OpenClaw, Hermes, Grok Bot or any other MCP client. Each returns a durable asset URL or a structured result, not prose the model has to re-parse.
Looking for the complete roster? It is at the tool reference — every tool with its real parameter schema, and machine-readable JSON beside it. That reference is generated: it is built by running the shipping MCP server and reading tools/list back over a real transport, so it is the exact surface your client receives. The categories below are a hand-written tour, not the inventory — they name the tools worth knowing by name, and the reference is what to trust when the two disagree. Full developer documentation: hermoso.ai/docs.
Research & ad spy — find_competitors, competitor_teardown, pull_competitor_ads, research_ads, mine_angles, score_ad, check_ad_policy, analyze_video; ad libraries search_meta_ads, search_google_ads, search_linkedin_ads; organic social search_tiktok, search_instagram, search_youtube, search_reddit, search_threads, search_threads_keyword; fetch_social_data; creative playbooks list_skills, get_skill, save_skill.
Create finished ads — brand draft_brand, get_brand, update_brand, use_brand, list_brands; plan plan_ad, plan_variations; render render_ad, generate_image, generate_video, generate_avatar, generate_voice, generate_text, make_template_ad (native HTML ad formats rendered directly, so the type is pixel-exact), make_explainer, product_sizzle, make_thumbnail; edit & finish remix_static, recast_motion, reframe_video, upscale_video, dub_video, change_voice, finish_video, fix_beat, post_edit, stitch_video, clip_video; assets list_product_photos, set_product_image, list_library, fetch_asset, upload_file.
Publish & schedule to your channels — post_to_meta (Facebook / Instagram / Threads), post_to_tiktok, post_to_youtube, schedule_post (one queue across Facebook, Instagram, Threads, TikTok, YouTube, X, LinkedIn, Pinterest, Bluesky and Telegram), list_scheduled, cancel_scheduled, manage_meta_post, update_youtube_video, upload_meta_asset, list_meta_pages, youtube_channel, tiktok_account, list_tiktok_videos. YouTube goes past the upload: list_youtube_videos, update_youtube_video, set_youtube_thumbnail (put a Hermoso thumbnail on an upload — the single biggest lever on click-through, and YouTube otherwise picks a frame at random) and youtube_video_insights (views, watch time, average view percentage, subscribers gained). Engagement: list_meta_comments, reply_to_meta_comment, moderate_meta_comment, list_threads_replies, reply_to_thread, list_youtube_comments, reply_to_youtube_comment. X / Twitter: post_to_x (text, image, video, replies, quote posts, polls and whole threads — 280 characters on an ordinary account and up to 25,000 on one with X Premium, read from the account rather than assumed, and never truncated), post_x_article (X’s own long-form Article, written in Markdown, with its headings, lists, quotes, code blocks and tables carried across), edit_x_post (rewrite a post you have already published, inside the hour X allows), delete_x_post, x_post_metrics and x_post_insights (impressions, likes, reposts, replies, quotes, bookmarks), x_post_insights_historical (the same advertiser numbers over any date range — x_post_insights only sees the last 28 hours), x_mentions — X is the one connector that bills credits per API call, because X charges us per request, and a post containing a link costs roughly 13× one without; your agent is quoted the price before it posts. LinkedIn: list_linkedin_pages, post_to_linkedin_page, post_to_linkedin, manage_linkedin_post, linkedin_page_analytics (organic Page performance — followers and follower gains, Page views, and post impressions, clicks and engagement, for the Page total or per post) — LinkedIn publishing targets the company Pages you tick — your personal profile is available too, but stays off until you explicitly share it. Pinterest: list_pinterest_boards, create_pinterest_board, post_to_pinterest, post_to_bluesky (image or video Pins on a board you pick). Threads goes further than publishing: list_threads_posts, list_threads_replies, reply_to_thread, hide_thread_reply, delete_thread, list_threads_mentions, threads_insights.
Read and answer the DMs. list_inbox puts everything anyone said to the brand in one list: Facebook and Instagram comments, Threads replies and mentions, YouTube and Reddit comments, Google reviews, Bluesky replies and X mentions, plus direct messages on Messenger, Instagram Direct, X, Bluesky and Telegram. reply_to_inbox_item answers any of them by id and routes to the right channel for you, so the agent never has to know which reply tool a platform uses. Per channel, when you want the whole thread rather than the newest line: list_meta_conversations, read_meta_conversation, reply_to_meta_message; list_x_dms, send_x_dm; list_bluesky_convos, read_bluesky_dm, send_bluesky_dm, mark_bluesky_convo_read; list_telegram_dms, list_telegram_chats, post_to_telegram; and on WhatsApp send_whatsapp_message, send_whatsapp_broadcast, list_whatsapp_templates, create_whatsapp_template. instagram_profile turns an Instagram @handle into the numeric account id Meta actually wants. What each platform allows differs, and Hermoso says which rule you are up against instead of letting you find out from a refusal: Meta permits a reply within 24 hours of the person writing, and that window is checked for free before anything sends; Telegram is a rolling 24-hour window rather than an inbox, because the Bot API publishes no history endpoint at all; X keeps 30 days of direct messages and bills per message read. WhatsApp is worth knowing about separately, because answering there is not an inbox reply: Hermoso sends on WhatsApp through send_whatsapp_message, either a Meta-approved template to open a conversation or a free-form reply inside Meta’s 24-hour customer-service window, and it asks you to confirm the exact wording and the exact number first, because it reaches a real phone and Meta bills the business for the conversation. Meta also publishes no WhatsApp history endpoint at all, so a conversation from before you connected cannot be fetched at any price. LinkedIn and Threads publish no usable direct-message API, so neither is offered.
Send one WhatsApp message, or broadcast to the whole list. send_whatsapp_broadcast takes one approved template out to a customer list, a segment or a launch, and fills in each person’s own {{1}} and {{2}} values as it goes, so a thousand people get a message that names them rather than the same blast a thousand times. Meta publishes no bulk endpoint, so it is a paced fan-out of one message per recipient and it runs as a queued job you poll rather than a call that waits: duplicate numbers are removed before anything sends, a number Meta cannot use is refused by name instead of quietly dropped, and every recipient carries its own outcome in the result, so a partial failure is reported as a partial failure and never as a success. Run it with dryRun first: that costs nothing, sends nothing, and reports the real recipient count, the template’s live category, what Meta will bill for it, and whether the list fits inside your business portfolio’s moving 24-hour messaging limit. Meta bills you directly for the messages, per message, at its own per-country rates, so a broadcast spends no Hermoso credits. Two rules there are Meta’s rather than ours, and both are permanent: a broadcast is always an approved template, because free-form text is legal only inside the 24-hour window that opens when that person writes to you first; and WhatsApp requires the recipient to have opted in, which nothing in the API enforces and which stays the business’s responsibility.
One content calendar across every channel — schedule_post queues a finished render to one or several channels at a chosen time with per-channel captions; list_scheduled reads what is queued and what already fired, with per-channel outcomes; cancel_scheduled pulls a post back before it goes out. In the studio the same queue is a real calendar — month, week and list views, drag a post to reschedule it, edit or duplicate any entry, and standing time-slots you can drop work into. Hermoso publishes at the appointed time; nothing has to stay open.
Run Meta ad campaigns — create_meta_campaign, create_meta_adset, create_meta_ad, find_meta_audiences, list_meta_ads, meta_insights, meta_page_insights, meta_post_insights, update_meta_object, set_meta_campaign_status, delete_meta_object — objects are created paused, and every spend and delete is confirm-gated. Before a budget is committed: preview_meta_ad renders the real ad per placement as a link you can look at, and estimate_meta_reach says how many people a targeting spec actually reaches. Audiences: list_meta_audiences and create_meta_audience build website-pixel retargeting, Page and Instagram engagement audiences, and lookalikes — creating one spends nothing. meta_insights breaks performance down by age, gender, placement and country.
Run Google Ads campaigns — create_google_ads_campaign, create_google_ads_ad_group, create_google_ads_ad, add_google_ads_keywords, set_google_ads_budget, set_google_ads_bidding, set_google_ads_targeting, set_google_ads_status, find_google_ads_locations, upload_google_ads_asset, list_google_ads_campaigns, google_ads_report (GAQL) — the whole tree is built in one atomic operation, then read back from Google before the agent narrates what it made. Beyond the tree: create_google_ads_conversion_action and list_google_ads_conversion_actions (what Google counts as a result — TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSIONS and every Performance Max campaign are undeliverable without one, so Hermoso refuses to build them on an account that has none), create_google_ads_performance_max_campaign (Google’s cross-surface campaign type), add_google_ads_assets (sitelinks, callouts and structured snippets, created and attached — an unattached asset shows nothing) and google_ads_keyword_ideas (Keyword Planner: real monthly search volume, competition and top-of-page bids, so keywords are chosen from data rather than guessed).
Run LinkedIn, Pinterest, Microsoft, X, TikTok, Snapchat, ChatGPT and Apple Search Ads — the same paused-by-default, confirm-gated pattern on every other paid platform. LinkedIn: list_linkedin_ads_campaigns, linkedin_ads_report, create_linkedin_ads_campaign_group, create_linkedin_ads_campaign, create_linkedin_ads_creative, search_linkedin_ads_targeting, set_linkedin_ads_budget, set_linkedin_ads_status, delete_linkedin_ads_object. Pinterest: list_pinterest_ads_campaigns, pinterest_ads_report, create_pinterest_ads_campaign, create_pinterest_ads_ad_group, create_pinterest_ads_ad, set_pinterest_ads_budget, set_pinterest_ads_status. Microsoft Advertising (Bing): list_microsoft_ads_campaigns, microsoft_ads_report, create_microsoft_ads_campaign, create_microsoft_ads_ad_group, create_microsoft_ads_ad, add_microsoft_ads_keywords, set_microsoft_ads_budget, set_microsoft_ads_status, microsoft_ads_geo_search (resolve country, region and city names to the Microsoft location ids a campaign needs — without locations a Microsoft campaign is created serving worldwide, which is Microsoft’s own default, and the read-back warns you loudly). Reddit Ads — the full account tree: list_reddit_ads_campaigns, reddit_ads_report, create_reddit_ads_campaign, create_reddit_ads_ad_group, create_reddit_ads_ad, create_reddit_ads_post (a Reddit ad promotes a post, so the creative is a post), set_reddit_ads_status, plus free planning with search_reddit_ads_targeting, reddit_ads_forecast and reddit_ads_bid_suggestion, conversion tracking through list_reddit_ads_pixels and send_reddit_ads_conversions, retargeting and saved audiences, lead forms, and reddit_ads_history. ChatGPT Ads — the ads that run under a ChatGPT answer, via OpenAI’s Advertiser API: list_openai_ads_campaigns, openai_ads_report, openai_ads_geo_search, create_openai_ads_campaign, create_openai_ads_ad_group, create_openai_ads_ad, update_openai_ads_object, set_openai_ads_budget, set_openai_ads_status. ChatGPT Ads has exactly one creative format, a text-plus-image card, and no video — so the agent will pull a still from your film rather than offer you a video ad there. X Ads — the full promoted-post tree, live since August 2026: list_x_ads_accounts, list_x_ads_funding_instruments, x_ads_report, create_x_ads_campaign, create_x_ads_line_item (X’s name for an ad group), create_x_ads_promoted_tweet, add_x_ads_targeting, x_ads_targeting_search, x_ads_geo_search, update_x_ads_campaign, update_x_ads_line_item, set_x_ads_status, delete_x_ads_object. An X ad promotes a post, so the creative is a post — the same one post_to_x publishes. TikTok Ads is a SEPARATE connection from the TikTok posting connector, and it is the one platform that creates objects ENABLED by default, so Hermoso forces every tier PAUSED with no override: list_tiktok_ads_accounts, list_tiktok_ads_campaigns, list_tiktok_ads_identities, search_tiktok_ads_targeting, tiktok_ads_report, create_tiktok_ads_campaign, create_tiktok_ads_ad_group, upload_tiktok_ads_creative, create_tiktok_ads_ad, set_tiktok_ads_budget, set_tiktok_ads_status, delete_tiktok_ads_object. Snapchat Ads: list_snapchat_ads_accounts, list_snapchat_ads_campaigns, list_snapchat_ads_profiles, search_snapchat_ads_targeting, snapchat_ads_report, upload_snapchat_ads_creative, create_snapchat_ads_campaign, create_snapchat_ads_ad_squad, create_snapchat_ads_ad, set_snapchat_ads_budget, set_snapchat_ads_status, delete_snapchat_ads_object — budgets are micro-currency (1,000,000 = one unit), the creative headline caps at 34 characters, and a Snapchat ad points at a CREATIVE rather than a media id. Three access notes worth having before you plan a budget: LinkedIn and Pinterest both meter ad writes by the API tier your own ad account holds — reporting and reads are unrestricted, while creating campaigns depends on the access your account has been granted by the platform. Meta, Google Ads, Microsoft Advertising, Reddit Ads and ChatGPT Ads have no such tier. X grants Ads API access per AD ACCOUNT rather than per app, so instead of an OAuth button you add Hermoso’s X user to your ad account at business.x.com → Account access, and it appears in list_x_ads_accounts with the permission level X gave it.
Build Apple Search Ads, and read them down to the search term — App Store search ads, end to end. Build: create_apple_ads_campaign, create_apple_ads_ad_group, add_apple_ads_keywords, add_apple_ads_negative_keywords, create_apple_ads_creative, create_apple_ads_ad, upload_apple_ads_asset, update_apple_ads_object, set_apple_ads_status, delete_apple_ads_object — every object is created paused with no override, enabling is the one switch that arms real spend and it is confirm-gated, and every summary is built from a read-back of what Apple actually stored. Ads run on the Search tab placement; a Search results campaign needs no ad and no creative at all, because Apple renders your App Store product page itself — and Hermoso says so for free rather than letting Apple reject the build. Read: list_apple_ads_campaigns (status, serving status, daily and total budget, the countries it runs in, and Apple’s own stated reason when a campaign cannot run), list_apple_ads_ad_groups (default bid, and whether Apple’s Search Match is on), list_apple_ads_keywords (targeting and negative, with match type and bid), apple_ads_report (impressions, taps, installs, spend, TTR, CPT and CPA, at campaign, ad group, keyword, search-term or ad level), list_apple_ads_creatives, list_apple_ads_ads, list_apple_ads_assets, list_apple_ads_product_pages (your App Store listing and any custom product pages, with their per-language content), search_apple_ads_apps and check_apple_ads_app_eligibility (which placements, countries and devices your app may actually advertise on — worth reading before you build) and list_apple_ads_orgs. There is no OAuth button for it, because Apple publishes no OAuth flow: Hermoso generates the signing key, you paste its public half into Apple Ads → Account Settings → API and paste back three ids. Apple shows that field only to a user holding an API role, so an Account Admin invites or switches to one first — the Apple Search Ads setup guide walks the whole thing. Each connection is pinned to the single Apple Ads organization you chose when you made it.
Report & export — Google Drive save_to_drive, list_drive_files, get_drive_file, update_drive_file, delete_drive_file, create_drive_folder; Sheets create_sheet, append_to_sheet, read_sheet; Docs create_doc, append_to_doc, read_doc; Microsoft OneDrive save_to_onedrive, list_onedrive_files, get_onedrive_file, update_onedrive_file, create_onedrive_folder, delete_onedrive_file.
Memory, brands, skills & team — remember, forget, list_memory, store_get; brand workspaces create_brand, delete_brand, use_brand, list_brands — an agency can take on a new client and tear one down without opening the app, and brand workspaces are unlimited on every plan; skills — ONE library, into which what used to be a separate “AI employees” store was folded — save_skill, list_skills, get_skill, delete_skill; team invite_member, list_team, set_role, remove_member.
Account, settings & connectors — hermoso_capabilities (probe models + exact per-render costs — call it first), hermoso_credits, buy_credits, billing_status, upgrade_plan, set_auto_reload, get_job, list_jobs, report_bug, request_feature; settings get_settings, update_settings (language and appearance, saved to the account rather than a browser, so an agent-only customer is not stuck in English); connectors list_connectors, list_connector_accounts, set_connector_accounts (choose exactly which Pages, ad accounts and boards are usable — the tool reports the server’s read-back, never the request), disconnect_connector. Connecting an account is an OAuth consent screen, so it is the one step that still needs a browser; everything after it is agent-callable.