{"apiVersion":"v1","directorySlug":"vibemeasite-mcp-791bb6231b","title":"VibeMeASite","description":"VibeMeASite turns a conversation into a live, professional website — running on Vercel, Neon, Cellpy and Resend — built entirely through chat with Claude, ChatGPT, or any MCP-compatible assistant. Free for 14 days, no credit card.","pageUrl":"https://www.mcpbundles.com/skills/vibemeasite-mcp-791bb6231b","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.vibemeasite.com/api/mcp","hostedMcpUrl":null,"toolCount":134,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.vibemeasite/vibemeasite-mcp-791bb6231b","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"whoami","description":"Return the VibeMeASite account currently authenticated in this session.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"whoami","displayName":"whoami","title":"whoami"},{"name":"list_my_sites","description":"List every site the logged-in account owns, and which one is active — every other tool acts on the active one. Only useful for admin accounts that own more than one site (see create_site); everyone else will just see their one site here.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_my_sites","displayName":"list_my_sites","title":"list_my_sites"},{"name":"switch_site","description":"Switch which of the logged-in account's sites every other tool acts on. Only meaningful for admin accounts that own more than one site (see create_site, list_my_sites) — refuses if the given id isn't one of the caller's own sites.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["site_id"],"properties":{"site_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"switch_site","displayName":"switch_site","title":"switch_site","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_site_languages","description":"Add one or more languages to the Site Owner's existing site — for a\nsite that wasn't set up as multi-language at create_site time, or\nneeds another language later. Additive only: never changes the\nsite's primary/default language (the one create_site set originally),\nsince that would disrupt every section already published in it.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["languages"],"properties":{"languages":{"type":"array","items":{"type":"string","minLength":1},"minItems":1}},"additionalProperties":false},"logicalName":"add_site_languages","displayName":"add_site_languages","title":"add_site_languages","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_language_switcher_style","description":"Choose how the header language switcher presents the site's declared\nlanguages (see create_site/add_site_languages) — either a row of\nshort text buttons (e.g. 'EN | UK | PL', the default) or a single\ndropdown <select>, optionally with a flag emoji next to each\nlanguage.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["style"],"properties":{"style":{"enum":["buttons","select"],"type":"string"},"show_flags":{"type":"boolean"},"label_style":{"enum":["code","native","native_english"],"type":"string"}},"additionalProperties":false},"logicalName":"set_language_switcher_style","displayName":"set_language_switcher_style","title":"set_language_switcher_style","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"upgrade_plan","description":"Upgrade the Site Owner's dedicated Cellpy org to a higher plan, raising\nthe section cap, and start a 14-day free trial (no card required). Call\nthis as soon as the Site Owner says they're ready for a paid/higher plan\n— don't tell them to log in anywhere, this does it directly. A\nconfirmation email is sent to them automatically.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["plan"],"properties":{"plan":{"enum":["starter","pro","business"],"type":"string"}},"additionalProperties":false},"logicalName":"upgrade_plan","displayName":"upgrade_plan","title":"upgrade_plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_collaborators","description":"List everyone with editor access to this site, plus anyone invited but not yet logged in. Owner-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_collaborators","displayName":"list_collaborators","title":"list_collaborators"},{"name":"revoke_collaborator","description":"Remove someone's editor access to this site, whether active or still-pending. Owner-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["email"],"properties":{"email":{"type":"string","format":"email"}},"additionalProperties":false},"logicalName":"revoke_collaborator","displayName":"revoke_collaborator","title":"revoke_collaborator","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_collaborator_access","description":"Change what an existing collaborator on this site is allowed to edit.\nOwner-only. Use list_collaborators first to see current access.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["email"],"properties":{"email":{"type":"string","format":"email"},"pages":{"type":"array","items":{"type":"string"}},"can_edit_others_sections":{"type":"boolean"}},"additionalProperties":false},"logicalName":"set_collaborator_access","displayName":"set_collaborator_access","title":"set_collaborator_access","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"admin_find_sites","description":"Admin-only. Search across ALL tenants' sites — for support/\nsupervision, not for your own account. Matches business name, owner\nemail, or custom domain (partial match). Returns each match's site\nid, which admin_act_as_site needs to start acting as its owner.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"query":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"admin_find_sites","displayName":"admin_find_sites","title":"admin_find_sites"},{"name":"admin_act_as_site","description":"Admin-only. Start acting as the owner of the given site — every other\ntool (read and write) will act on that tenant's site instead of your\nown, until admin_stop_acting_as is called. Use admin_find_sites first\nto get the site id. Persists until explicitly cleared — there is no\nauto-expiry. Every tool call made while impersonating is audit-logged.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["site_id"],"properties":{"site_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"admin_act_as_site","displayName":"admin_act_as_site","title":"admin_act_as_site","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"admin_stop_acting_as","description":"Admin-only. Stop acting as a tenant's site and return to your own account/site (if any).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"admin_stop_acting_as","displayName":"admin_stop_acting_as","title":"admin_stop_acting_as","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_menu_structure","description":"Retrieve the site's current navigation menu — each item's label,\nwhich page_slug it points to (if any — a childless label means it's\na category header), and its nested children (up to 3 levels), in\norder. Call before making a targeted change with set_menu_structure\n(e.g. 'add a Contact link') since that tool is a full replace — you\nneed the current items to include them again alongside the new one.\nAlso lists any pages that exist but aren't in the menu yet ANYWHERE\nin the tree (add_page doesn't","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_menu_structure","displayName":"get_menu_structure","title":"get_menu_structure"},{"name":"undo_header_change","description":"Revert the site's header/branding (colors, logo, phone, email, custom links, header_css) to the version immediately before the current one. Use this when the Site Owner asks to undo a header/branding change — don't try to reconstruct the old values yourself from the chat transcript.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"undo_header_change","displayName":"undo_header_change","title":"undo_header_change","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"redo_header_change","description":"Re-apply the header/branding change that was most recently undone with undo_header_change. Only valid right after an undo, before any new set_branding call.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"redo_header_change","displayName":"redo_header_change","title":"redo_header_change","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"generate_favicon","description":"Generate a favicon from a logo and return its URL — without changing\nthe site's live favicon. Use this to preview a favicon before\ncommitting to it, especially for a wide icon+wordmark banner logo\nwhere a blind square crop might cut off the mark.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"logo_svg":{"type":"string"},"logo_url":{"type":"string","format":"uri"}},"additionalProperties":false},"logicalName":"generate_favicon","displayName":"generate_favicon","title":"generate_favicon","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_branding","description":"Retrieve the site's current branding — colors, logo, favicon,\nsite_name/tagline, phone, email, custom links, and header_css (this is\nwhat shows in the header/nav). Call before making a targeted change\nwith set_branding (e.g. 'add an Instagram link') so you know what's\nalready set and don't drop existing custom_links or a custom\nlogo_svg — set_branding only touches the fields you pass, but you\nstill need the current values to reason about additions correctly.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_branding","displayName":"get_branding","title":"get_branding"},{"name":"get_analytics","description":"Retrieve the site's current analytics/SEO integration IDs (GA4, GTM, Meta Pixel, Search Console verification). Pairs with set_analytics.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_analytics","displayName":"get_analytics","title":"get_analytics"},{"name":"get_cookie_banner","description":"Retrieve the site's current cookie consent banner configuration — enabled, policy link, reopen control, whether custom CSS is set, which languages have translations, and one language's text. Pairs with set_cookie_banner.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"lang":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_cookie_banner","displayName":"get_cookie_banner","title":"get_cookie_banner"},{"name":"remove_floating_widget","description":"Remove a floating widget from the site. Soft-remove by default — the\nwidget's config is kept (list_floating_widgets still shows it,\ndisabled) so it can be brought back later by calling\nupdate_floating_widget(widget_id, ...) with any field, which\nre-enables it, same enabled:false/true parity as set_cookie_banner.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["widget_id"],"properties":{"widget_id":{"type":"string"}},"additionalProperties":false},"logicalName":"remove_floating_widget","displayName":"remove_floating_widget","title":"remove_floating_widget","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_floating_widgets","description":"List every floating widget on the site, including disabled ones.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_floating_widgets","displayName":"list_floating_widgets","title":"list_floating_widgets"},{"name":"add_page","description":"Add a new page to the site — before or after go_live. Doesn't add it\nto the navigation menu automatically; call set_menu_structure\nafterward if the Site Owner wants it in the nav.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","name"],"properties":{"name":{"type":"string","minLength":1},"slug":{"type":"string","pattern":"^[a-z0-9-]{1,64}$"},"in_scroll":{"type":"boolean"}},"additionalProperties":false},"logicalName":"add_page","displayName":"add_page","title":"add_page","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_page_seo","description":"Set a page's SEO title, meta description, and/or social sharing image\n— independently of the page's structural title (the one set at\nadd_page / shown in the menu). This is separate from\ngenerate_block/set_header_translations, which only affect visible\nsection content and the header/nav chrome.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page_slug"],"properties":{"lang":{"type":"string"},"image_key":{"type":"string"},"image_url":{"type":"string","format":"uri"},"page_slug":{"type":"string"},"image_mime_type":{"type":"string"},"image_rights_confirmed":{"type":"boolean"}},"additionalProperties":false},"logicalName":"set_page_seo","displayName":"set_page_seo","title":"set_page_seo","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_event_signup_pages","description":"List every event signup landing page on this site, with its scope, caps, signup count, expiry, and whether it's still open. Owner-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_event_signup_pages","displayName":"list_event_signup_pages","title":"list_event_signup_pages"},{"name":"get_event_signup_qr","description":"Regenerate the printable QR code (framed SVG poster + plain PNG) for an existing event signup page. Owner-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page"],"properties":{"page":{"type":"string"},"center_label":{"type":"string","maxLength":8,"minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_event_signup_qr","displayName":"get_event_signup_qr","title":"get_event_signup_qr"},{"name":"list_event_signups","description":"List everyone who registered through one event signup page — name, email, any extra fields, and whether they've logged in yet. Owner-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page"],"properties":{"page":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_event_signups","displayName":"list_event_signups","title":"list_event_signups"},{"name":"close_event_signup_page","description":"Stop an event signup page from granting any more access — disables the\nform's handler and clears its webhook. The page itself stays up. This\ndoes NOT revoke people who already signed up; use list_event_signups\nand revoke_collaborator for that. Owner-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page"],"properties":{"page":{"type":"string"}},"additionalProperties":false},"logicalName":"close_event_signup_page","displayName":"close_event_signup_page","title":"close_event_signup_page","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_glossary_term","description":"Record how a specific term (service name, brand term, unit of\nmeasurement) should read in each language, so the same term isn't\ntranslated inconsistently across different generate_block calls.\nCalling this again for a term already recorded merges translations\nand replaces notes, rather than creating a duplicate.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["term"],"properties":{"term":{"type":"string","minLength":1},"notes":{"type":"string"},"translations":{"type":"object","additionalProperties":{"type":"string"}}},"additionalProperties":false},"logicalName":"add_glossary_term","displayName":"add_glossary_term","title":"add_glossary_term","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_glossary_terms","description":"List this site's glossary terms — call before translating a section (generate_block with lang set) to keep terminology consistent.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_glossary_terms","displayName":"list_glossary_terms","title":"list_glossary_terms"},{"name":"remove_glossary_term","description":"Remove a glossary entry (e.g. a renamed service or retired product) so it stops being suggested during translation.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["term"],"properties":{"term":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"remove_glossary_term","displayName":"remove_glossary_term","title":"remove_glossary_term","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_translation_status","description":"Report which sections (plus the site-wide footer and any\nfloating-widget popup content) are missing a translation, or have a\ntranslation that predates the default-language content it was\ntranslated from ('outdated'), across every declared language (or one,\nif lang is passed). Use this to find translation gaps instead of\nmanually re-checking every section with get_page_content.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"lang":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_translation_status","displayName":"list_translation_status","title":"list_translation_status"},{"name":"get_media_upload_page_url","description":"Mint a link to a browser page where the Site Owner can upload as\nmany images and videos as they want (up to 20 files total) directly\nfrom their own device — no base64, no tool-call involvement at all.\nPrefer this over get_image_upload_url/get_video_upload_url whenever\nmore than one file is involved, or whenever you can't tell if they\nhave real file/network access (e.g. they're on the Claude mobile app\nor Claude Desktop, neither of which can run a raw PUT themselves) —\nthose environments have no","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_media_upload_page_url","displayName":"get_media_upload_page_url","title":"get_media_upload_page_url"},{"name":"get_media_library_url","description":"Mint a link to a browser page listing every one of the Site Owner's\nown photos sent through get_image_upload_url or\nget_media_upload_page_url — both the ones already placed into a\nsection with generate_block (\"used\", labeled with which block) and\nthe ones still sitting in temporary staging, sent but not yet placed\nanywhere (\"not used yet\") — each with a Copy button. Deliberately\nexcludes stock/external photos pulled in via generate_block\nimages[].url (Pexels, Pixabay, or any other fetched URL) —","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_media_library_url","displayName":"get_media_library_url","title":"get_media_library_url"},{"name":"photo_search","description":"Search freely licensed stock photos from Pexels and Pixabay. Call this\nwhenever a section needs a photo, background image, or illustration and\nthe Site Owner hasn't supplied their own.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"count":{"type":"integer","default":5,"maximum":20,"minimum":1},"query":{"type":"string","minLength":1},"source":{"enum":["pexels","pixabay","all"],"type":"string","default":"all"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"photo_search","displayName":"photo_search","title":"photo_search"},{"name":"video_search","description":"Search freely licensed stock VIDEO footage from Pexels and Pixabay —\nthe counterpart to photo_search, backed by the same API key(s). Use it\nwhen a section calls for background video or b-roll and the Site Owner\nhasn't supplied their own clip.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"count":{"type":"integer","default":5,"maximum":20,"minimum":1},"query":{"type":"string","minLength":1},"source":{"enum":["pexels","pixabay","all"],"type":"string","default":"all"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"video_search","displayName":"video_search","title":"video_search"},{"name":"set_stock_api_keys","description":"Save the Site Owner's Pexels and/or Pixabay API key on this site's\naccount so photo_search and video_search work. One key per service\ncovers both photos and videos.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"pexels_api_key":{"type":"string"},"pixabay_api_key":{"type":"string"}},"additionalProperties":false},"logicalName":"set_stock_api_keys","displayName":"set_stock_api_keys","title":"set_stock_api_keys","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_section","description":"Remove a section from a page. This unlinks it and stops it from\nrendering — the section's own html/css stays published on Cellpy\n(nothing is deleted there), so it isn't lost: list_cellpy_blocks will\nshow it under \"Not linked to a tracked page.\" To bring that content\nback, call generate_block for a container_slot (new or existing) with\nthe same html/css.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page_slug","container_slot"],"properties":{"page_slug":{"type":"string"},"container_slot":{"type":"string"}},"additionalProperties":false},"logicalName":"delete_section","displayName":"delete_section","title":"delete_section","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_booking_config","description":"Retrieve the booking widget's current services, custom fields,\nbusiness hours, and policy settings. Call this before translating\nwith update_booking_config's lang mode — service_translations/\ncustom_field_translations match by the exact current default-\nlanguage name shown here, and before changing services/custom_fields\nstructurally, since supplying either replaces the entire list.\nAlso shows which languages each service/field already has a\ntranslation for.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_booking_config","displayName":"get_booking_config","title":"get_booking_config"},{"name":"get_form_destination","description":"Look up which email address(es) currently receive a form section's\nsubmissions. Call this before set_form_destination if you don't\nalready know the current list (e.g. a fresh conversation) — a replace\ncall that omits an existing address removes it.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page_slug","container_slot"],"properties":{"page_slug":{"type":"string"},"container_slot":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_form_destination","displayName":"get_form_destination","title":"get_form_destination"},{"name":"set_footer","description":"Publish the site's footer — shown at the bottom of every page,\nunlike generate_block's sections which only appear on one page. Call\nagain to update; each call is a full replace. If set_branding has set\ncolors for this site, use var(--color-primary) etc. in your CSS so the\nfooter matches the header and the rest of the site.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["html"],"properties":{"css":{"type":"string","default":""},"html":{"type":"string","minLength":1},"lang":{"type":"string"}},"additionalProperties":false},"logicalName":"set_footer","displayName":"set_footer","title":"set_footer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_footer","description":"Retrieve the current html/css of the site's footer — the fixed\nsite-wide element set via set_footer, shown on every page. Unlike\nordinary sections, the footer has no page_slug/container_slot (it\nisn't tied to any one page), so get_cellpy_block can't reach it —\nuse this instead. Call before editing, then push changes back with\nset_footer (full replace, not a patch).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"lang":{"type":"string"},"version":{"type":"integer","exclusiveMinimum":0}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_footer","displayName":"get_footer","title":"get_footer"},{"name":"connect_resend","description":"Connect the Site Owner's OWN Resend account so their claimed site can\nsend its own 'Get a Quote'/contact-form emails directly, instead of\ndepending on Cellpy's central relay. Only call this after claim_site\nhas succeeded — ask 'claim your site first' if it hasn't.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["resend_api_key"],"properties":{"from_email":{"type":"string","format":"email"},"resend_api_key":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"connect_resend","displayName":"connect_resend","title":"connect_resend","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"connect_google_calendar","description":"Start connecting the Site Owner's Google Calendar to the booking\nwidget. Returns a URL — tell the Site Owner to open it, sign in with\nthe Google account whose calendar they want to use, and approve\naccess. There's no way to confirm completion from this call alone;\nonce they say they've done it, you can proceed (e.g. add_booking_widget)\n— it will simply fail with a clear error if the connection didn't\nactually complete.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"connect_google_calendar","displayName":"connect_google_calendar","title":"connect_google_calendar","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"connect_icloud_calendar","description":"Connect the Site Owner's iCloud (Apple) Calendar to the booking\nwidget. Returns a link to a hosted form where they enter their Apple\nID and an APP-SPECIFIC PASSWORD (never their real Apple ID password).\nIf they don't already have one, mention they can generate one at\nappleid.apple.com (Sign-In and Security -> App-Specific Passwords) —\nrequires two-factor authentication to be enabled on their Apple ID.\nThe form itself repeats these steps, so a full walkthrough here isn't\nnecessary.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"connect_icloud_calendar","displayName":"connect_icloud_calendar","title":"connect_icloud_calendar","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"disconnect_calendar","description":"Disconnect the Site Owner's calendar (Google or iCloud, whichever is\nconnected). The booking widget, if present, stops offering real\navailability until reconnected. Existing confirmed bookings and their\ncalendar events are unaffected.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"disconnect_calendar","displayName":"disconnect_calendar","title":"disconnect_calendar","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_bookings","description":"List upcoming confirmed appointments on the booking widget. Defaults\nto the next 30 days if from/to aren't given.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"to_iso":{"type":"string"},"from_iso":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_bookings","displayName":"list_bookings","title":"list_bookings"},{"name":"cancel_booking","description":"Cancel a specific confirmed appointment (use the id shown by\nlist_bookings). Removes it from the connected calendar and emails the\nvisitor a cancellation notice. State which appointment (visitor,\nservice, time) will be cancelled before calling this, same as any\nother destructive action.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["booking_id"],"properties":{"booking_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"cancel_booking","displayName":"cancel_booking","title":"cancel_booking","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"connect_google_reviews","description":"Start connecting the Site Owner's Google Business Profile so their real\nGoogle reviews show on the site. Returns a URL — tell them to open it,\nsign in with the Google account that MANAGES their business listing,\nand approve access. If that account manages more than one location,\nthe page they land on will ask which one to use. There's no way to\nconfirm completion from this call alone; once they say they're done\nyou can proceed (e.g. add_reviews_widget).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"connect_google_reviews","displayName":"connect_google_reviews","title":"connect_google_reviews","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"disconnect_google_reviews","description":"Disconnect the Site Owner's Google Business Profile. The reviews widget,\nif present, falls back to its empty state until reconnected. The cached\ncopy of their reviews is deleted.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"disconnect_google_reviews","displayName":"disconnect_google_reviews","title":"disconnect_google_reviews","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"go_live","description":"Deploy the Site Owner's finished site to a real, live preview URL —\nno Vercel/Neon account needed from them yet (staging-first model, see\nADR-001). This provisions a real Vercel project and database on\nCellpy's own infrastructure — it can take a minute or two. The site\nis live but time-boxed: mention the countdown (also shown as a banner\non the site itself) and that there are two ways to make it permanent —\nclaim_site moves it to their own Vercel/Postgres accounts (free, the\ndefault), or, if the","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"go_live","displayName":"go_live","title":"go_live","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"keep_hosted","description":"Keep the Site Owner's preview site running permanently on\nVibeMeASite's own hosting, instead of moving it to their own\nVercel/Postgres accounts. This is the alternative to claim_site —\npresent both before staging expires and ask which they'd prefer,\nrather than only ever offering claim_site.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"billing_interval":{"enum":["month","year"],"type":"string"}},"additionalProperties":false},"logicalName":"keep_hosted","displayName":"keep_hosted","title":"keep_hosted","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"upgrade_site_template","description":"Redeploy the Site Owner's site onto the current vibemeasite-template\ncode. This is the ONLY way template/code changes (new features like\nthe image lightbox, bug fixes, styling improvements to the shell\nitself) reach an already-deployed site — sites are one-time file\nsnapshots, not git-linked, so nothing pushed to the template repo\nreaches a live site automatically. Site content (pages, blocks,\nbranding, menu) is untouched — this only touches the app code.\nConfirm with the Site Owner before calli","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"upgrade_site_template","displayName":"upgrade_site_template","title":"upgrade_site_template","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_section_versions","description":"Show the saved edit history for one section, newest first. A version\nis saved automatically each time generate_block (or revert_section)\nreplaces a section — it holds the content as it was JUST BEFORE that\nreplacement, so the section's CURRENT live content is not in this\nlist. Up to 10 versions are kept per section (per language).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page_slug","container_slot"],"properties":{"lang":{"type":"string"},"page_slug":{"type":"string"},"container_slot":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_section_versions","displayName":"list_section_versions","title":"list_section_versions"},{"name":"revert_section","description":"Restore a section to an earlier saved version and republish it live.\nBy default (steps: 1) it goes back to the single most recent saved\nversion — i.e. undoes the last generate_block edit to that section.\nPass a larger steps to go back further; call list_section_versions\nfirst if you're not sure how many edits back to go.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["page_slug","container_slot"],"properties":{"lang":{"type":"string"},"steps":{"type":"integer","minimum":1},"page_slug":{"type":"string"},"container_slot":{"type":"string"}},"additionalProperties":false},"logicalName":"revert_section","displayName":"revert_section","title":"revert_section","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_cellpy_blocks","description":"List every section already published for this site, grouped by page —\ncontainer_slot, category, current version, and CDN URLs\n(staging/production). Read-only; scoped to this site's own Cellpy\nservice account, same as get_page_content and generate_block. Useful\nfor a quick inventory of what's on which page without pulling full\nhtml/css for every page the way get_page_content does.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_cellpy_blocks","displayName":"list_cellpy_blocks","title":"list_cellpy_blocks"},{"name":"get_draft_summary","description":"Summarize the Site Owner's current site — pages, menu, branding, and published sections.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_draft_summary","displayName":"get_draft_summary","title":"get_draft_summary"},{"name":"list_entities","description":"List the site's structured entities (directories) — their fields, layout, which page each is placed on, and how many entries each holds.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_entities","displayName":"list_entities","title":"list_entities"},{"name":"delete_entity","description":"Delete an entity. Refuses if it still has entries unless force is true;\nwith force, its entries are deleted too. Any leftover <div data-entity>\nmarker for it simply renders nothing afterward.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string"},"force":{"type":"boolean"}},"additionalProperties":false},"logicalName":"delete_entity","displayName":"delete_entity","title":"delete_entity","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"bind_entity_page","description":"Set which page shows an entity's directory. A member can't add entries to\nan entity until it's placed on a page (their edit access is page-scoped).\nAfter this, put <div data-entity=\"<slug>\"></div> inside a section on that\npage with generate_block.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","page_slug"],"properties":{"slug":{"type":"string"},"page_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"bind_entity_page","displayName":"bind_entity_page","title":"bind_entity_page","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_entity_format","description":"Show a directory's field schema and an example prompt for adding an entry.\nCall this before add_entry so your entry matches the entity's fields.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_entity_format","displayName":"get_entity_format","title":"get_entity_format"},{"name":"add_entry","description":"Add one entry to a directory (entity) — your own profile, business, job,\nservice, or opportunity. Call get_entity_format first to see the fields.\nPass `data` as an object of { field_key: value }. You can edit or remove\nyour own entry later with update_entry / delete_entry.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["entity_slug","data"],"properties":{"data":{"type":"object","additionalProperties":{}},"lang":{"type":"string"},"entity_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"add_entry","displayName":"add_entry","title":"add_entry","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_entry","description":"Change an existing entry. Omit `entry_id` if the directory is one-per-person\n(it resolves to your entry). You can only change your own entries.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["entity_slug","data"],"properties":{"data":{"type":"object","additionalProperties":{}},"lang":{"type":"string"},"entry_id":{"type":"string"},"entity_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"update_entry","displayName":"update_entry","title":"update_entry","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_entry","description":"Remove an entry. Omit `entry_id` for a one-per-person directory. You can only delete your own entries.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["entity_slug"],"properties":{"entry_id":{"type":"string"},"entity_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"delete_entry","displayName":"delete_entry","title":"delete_entry","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"approve_entry","description":"Publish a pending entry in one of your directories.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["entity_slug","entry_id"],"properties":{"entry_id":{"type":"string"},"entity_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"approve_entry","displayName":"approve_entry","title":"approve_entry","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reject_entry","description":"Delete a pending entry and (if possible) email the contributor why.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["entity_slug","entry_id"],"properties":{"reason":{"type":"string"},"entry_id":{"type":"string"},"entity_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"reject_entry","displayName":"reject_entry","title":"reject_entry","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_pending_sections","description":"List page sections submitted by event-signup collaborators that are awaiting your approval before they go live.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_pending_sections","displayName":"list_pending_sections","title":"list_pending_sections"},{"name":"approve_section","description":"Publish a pending section (submitted by an event-signup collaborator) to the live site.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"approve_section","displayName":"approve_section","title":"approve_section","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reject_section","description":"Discard a pending section (submitted by an event-signup collaborator) and (if possible) email the contributor why.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"},"reason":{"type":"string"}},"additionalProperties":false},"logicalName":"reject_section","displayName":"reject_section","title":"reject_section","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_email_otp_auth","description":"Enable email sign-in for this site's shoppers (6-digit code, no\npassword) — the identity layer Phase 20 e-commerce checkout requires.\nIdempotent: calling this again on an already-enabled site is a no-op.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"add_email_otp_auth","displayName":"add_email_otp_auth","title":"add_email_otp_auth","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"remove_email_otp_auth","description":"Disable shopper email sign-in on this site. Existing shopper accounts and sessions are kept, not deleted, in case it's re-enabled later.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"remove_email_otp_auth","displayName":"remove_email_otp_auth","title":"remove_email_otp_auth","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"enable_demo_checkout","description":"Turn on a DEMO payment connection for this site's storefront — no\nreal account, no real charge. Lets you build and demo the full\ncatalog/cart/checkout/order flow today. This is not a real payment\nprocessor: nothing charged through it is actually collected. Real\nStripe Connect support is planned but not built yet.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"logicalName":"enable_demo_checkout","displayName":"enable_demo_checkout","title":"enable_demo_checkout","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_payment_connection","description":"Check this site's current payment connection status (provider, onboarding status). Never returns any credential or account secret.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_payment_connection","displayName":"get_payment_connection","title":"get_payment_connection"},{"name":"update_product","description":"Update a product's fields — only pass what's changing.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"active":{"type":"boolean"},"images":{"type":"array","items":{"type":"string"}},"price_cents":{"type":"integer","exclusiveMinimum":0},"stock_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]}},"additionalProperties":false},"logicalName":"update_product","displayName":"update_product","title":"update_product","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_product","description":"Remove a product. If it has ever appeared in an order, it's deactivated instead (kept for order history) rather than deleted.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"delete_product","displayName":"delete_product","title":"delete_product","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_products","description":"List this site's products.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"include_inactive":{"type":"boolean","default":false}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_products","displayName":"list_products","title":"list_products"},{"name":"list_orders","description":"List this site's orders, most recent first.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"status":{"enum":["paid","fulfilled","canceled","refunded"],"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_orders","displayName":"list_orders","title":"list_orders"},{"name":"get_order","description":"Get full detail on one order, including its line items.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_order","displayName":"get_order","title":"get_order"},{"name":"update_order_status","description":"Update an order's status — paid → fulfilled/canceled/refunded, or fulfilled → canceled/refunded. Refunded orders call the payment provider's refund API where applicable.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"enum":["fulfilled","canceled","refunded"],"type":"string"}},"additionalProperties":false},"logicalName":"update_order_status","displayName":"update_order_status","title":"update_order_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_breadcrumbs","description":"Turn breadcrumbs on/off and pick a style. Breadcrumbs are derived, not\nauthored — the trail is [Home, current page], with the entity name\nappended when that page is bound to an entity via bind_entity_page.\nStyle it via the .vms-breadcrumbs class contract using the same\nvar(--color-*) tokens set_branding's colors establish.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["enabled"],"properties":{"style":{"enum":["chevron","slash"],"type":"string"},"enabled":{"type":"boolean"}},"additionalProperties":false},"logicalName":"set_breadcrumbs","displayName":"set_breadcrumbs","title":"set_breadcrumbs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_carousel_config","description":"Update a carousel's presentation settings — arrows, transition (fade/slide), autoplay, interval. Only the fields you pass are changed.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["carousel_id","config"],"properties":{"config":{"type":"object","properties":{"arrows":{"type":"boolean"},"autoplay":{"type":"boolean"},"intervalMs":{"type":"integer","exclusiveMinimum":0},"transition":{"enum":["fade","slide"],"type":"string"}},"additionalProperties":false},"carousel_id":{"type":"string"}},"additionalProperties":false},"logicalName":"set_carousel_config","displayName":"set_carousel_config","title":"set_carousel_config","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_carousel_slides","description":"List a carousel's slides in order, with enough detail to match what the Site Owner describes before reordering or deleting one.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["carousel_id"],"properties":{"carousel_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_carousel_slides","displayName":"list_carousel_slides","title":"list_carousel_slides"},{"name":"reorder_carousel_slides","description":"Set the display order of a carousel's slides. Pass every slide id for this carousel, in the desired order — use list_carousel_slides first if you don't already have them.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["carousel_id","slide_ids_in_order"],"properties":{"carousel_id":{"type":"string"},"slide_ids_in_order":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false},"logicalName":"reorder_carousel_slides","displayName":"reorder_carousel_slides","title":"reorder_carousel_slides","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_carousel_slide","description":"Remove one slide from a carousel.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slide_id"],"properties":{"slide_id":{"type":"string"}},"additionalProperties":false},"logicalName":"delete_carousel_slide","displayName":"delete_carousel_slide","title":"delete_carousel_slide","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"enable_blog","description":"Turn on the blog. Creates the blog index page at the reserved slug\n\"blog\" (URL /blog) if it doesn't exist yet — idempotent, safe to\ncall again to update the title/description. Doesn't add a nav item\nautomatically; call set_menu_structure afterward if the Site Owner\nwants \"Blog\" in the header.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":false},"logicalName":"enable_blog","displayName":"enable_blog","title":"enable_blog","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"create_blog_category","description":"Define a blog category. Categories nest at most ONE level deep —\nparent_slug, if given, must itself be a top-level category (no\nparent of its own).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name"],"properties":{"name":{"type":"string","minLength":1},"slug":{"type":"string"},"parent_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"create_blog_category","displayName":"create_blog_category","title":"create_blog_category","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_blog_categories","description":"List every blog category, with its post count if the site is live.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_blog_categories","displayName":"list_blog_categories","title":"list_blog_categories"},{"name":"delete_blog_category","description":"Delete a blog category. Refuses if any post still references it, or\nif it has child categories, unless force is true — with force, the\ncategory is removed from every referencing post's category list too.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string"},"force":{"type":"boolean"}},"additionalProperties":false},"logicalName":"delete_blog_category","displayName":"delete_blog_category","title":"delete_blog_category","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_blog_post","description":"Delete a blog post — its page, sections, and metadata.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["post_slug"],"properties":{"post_slug":{"type":"string"}},"additionalProperties":false},"logicalName":"delete_blog_post","displayName":"delete_blog_post","title":"delete_blog_post","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_blog_posts","description":"List blog posts, optionally filtered by status, tag, or category.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"tag":{"type":"string"},"status":{"enum":["draft","scheduled","published"],"type":"string"},"category":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_blog_posts","displayName":"list_blog_posts","title":"list_blog_posts"},{"name":"list_blog_tags","description":"List every blog tag (name, slug, and post count if the site is live) —\ncheck here before writing a new tag name so add_blog_post/\nupdate_blog_post reuses an existing tag instead of creating a near-\nduplicate (e.g. \"Style Tips\" vs \"Styling Tips\").","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_blog_tags","displayName":"list_blog_tags","title":"list_blog_tags"},{"name":"rename_blog_tag","description":"Rename a tag's display name without changing its slug (so its /blog/tag/{slug} URL and every post referencing it keep working unchanged).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","name"],"properties":{"name":{"type":"string","minLength":1},"slug":{"type":"string"}},"additionalProperties":false},"logicalName":"rename_blog_tag","displayName":"rename_blog_tag","title":"rename_blog_tag","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_blog_tag","description":"Delete a tag. Refuses if any post still uses it unless force is true —\nwith force, the tag is removed from every referencing post as well as\ndeleted.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string"},"force":{"type":"boolean"}},"additionalProperties":false},"logicalName":"delete_blog_tag","displayName":"delete_blog_tag","title":"delete_blog_tag","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=VibeMeASite&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AudmliZW1lYXNpdGUuY29tL2FwaS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22VibeMeASite%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.vibemeasite.com%2Fapi%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22VibeMeASite%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.vibemeasite.com%2Fapi%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=VibeMeASite&connectorUrl=https%3A%2F%2Fmcp.vibemeasite.com%2Fapi%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"VibeMeASite\" --url \"https://mcp.vibemeasite.com/api/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/vibemeasite-mcp-791bb6231b","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/vibemeasite-mcp-791bb6231b/tools/{tool}","mcpServerUrl":"https://mcp.vibemeasite.com/api/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/vibemeasite-mcp-791bb6231b?live=1"}