{"$schema":"https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json","name":"com.convika/convika","title":"Convika","description":"Publish AI-made landing pages on your own domain, with a signup form and visitor stats.","version":"1.0.1","websiteUrl":"https://convika.com/?utm_source=mcp_server_card&utm_medium=referral&utm_campaign=mcp_directory","icons":[{"src":"https://convika.com/icon-512.png","mimeType":"image/png","sizes":["512x512"]},{"src":"https://convika.com/favicon.svg","mimeType":"image/svg+xml","sizes":["any"]}],"remotes":[{"type":"streamable-http","url":"https://mcp.convika.com/mcp","supportedProtocolVersions":["2025-11-25","2025-06-18","2025-03-26","2024-11-05","2024-10-07"]}],"protocolVersion":"2025-11-25","serverInfo":{"name":"convika","version":"0.1.0","title":"Convika - Landing Page Ops for AI Clients"},"iconUrl":"https://convika.com/icon-512.png","documentationUrl":"https://convika.com/docs/","transport":{"type":"streamable-http","endpoint":"https://mcp.convika.com/mcp"},"capabilities":{"tools":{"listChanged":true}},"authentication":{"required":true,"schemes":["oauth2"],"resourceMetadata":"https://mcp.convika.com/.well-known/oauth-protected-resource","authorizationServer":"https://mcp.convika.com"},"instructions":"Convika hosts landing pages. It saves the HTML you write for the user, returns a private preview link, publishes the page to a live URL when the user asks, and reports visits, traffic sources, button clicks, and form signups.\n\n== When to use these tools ==\nThe user wants to create, edit, publish, or measure a landing page or small marketing site with Convika. That covers:\n- a request that names Convika or starts with \"[Use Convika MCP tools]\"\n- a question about a page already on Convika, such as \"how is my waitlist page doing this week?\"\n- a landing page request from a user who connected Convika to build pages, such as \"make me a landing page for my café opening\" or \"カフェ開店のランディングページを作って\"\nIf the user names another tool or host for the page, follow the user. General HTML or CSS questions, and files in the user's own project, don't need these tools.\n\n== Creating a new page ==\nWrite the complete HTML first, then call create_landing_page_preview once. It creates the site, assigns the requested URL when provided, sets goals, saves the HTML as the first version, and returns a private preview link. Show the user that link so they can review the page.\nUse the lower-level tools only for editing existing pages, recovery after partial failures, or workflows where the full HTML is not ready yet:\n1. create_site or create_landing_page — create a new site. If the user mentioned a full URL or domain/path such as https://www.example.com/lp2, pass it in the url argument. Never convert a requested path like /lp2 into a managed subdomain.\n2. set_goals — define conversion goals (form_submission, cta_click)\n3. save_page_content — save the HTML to Convika (use Tailwind CSS v3)\n4. set_site_url — when the user asks for a specific custom URL, assign that full URL to the site\n5. create_preview — generate a token-protected preview URL for user review\n6. publish_site — only after the user explicitly asks to publish/go live\n\n== Editing an existing page ==\nlist_sites → get_site → save_page_content → create_preview → wait for user approval → publish_site\n\n== Analytics ==\n- get_analytics_summary / get_analytics_detail — traffic, devices, sources, conversions. Bot and vulnerability scanner traffic is excluded by default; use botFilter=include only for diagnostics.\n- analyze_site_performance — compact conversion and traffic diagnosis with prioritized next actions. Prefer this when the user asks what to improve or why performance changed.\n- analyze_source_quality — source/UTM-level traffic and attributed conversion quality. Prefer this when the user asks which campaigns, referrers, or sources are working.\n- query_timeseries — daily pageviews and visitors, split by device, country, referrer, path, or UTM field. query_segments — two audiences (for example mobile vs desktop) side by side.\n- query_cta_performance — clicks per CTA per day. get_page_structure — the sections, headings, and CTA placements of a saved page version.\n- detect_trend — checks whether a daily series (for example visitors from query_timeseries) is really rising or falling.\n\n== Forms ==\ncreate_form — add contact/signup forms with automatic spam protection and storage\nA form needs a site id, so it can't go into the first create_landing_page_preview call. New page with a form: create_landing_page_preview (returns siteId) → create_form → save_page_content with the form embed → create_preview.\n\n== Publishing ==\npublish_site, rollback_site, and unpublish_site change what anyone can see at the page's live URL. Call them only when the user explicitly asks to publish, go live, roll back, or take the page down. Until then, share preview links.","tools":[{"name":"ping","title":"Check connection","description":"Health check tool that returns pong","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Check connection"},"execution":{"taskSupport":"forbidden"}},{"name":"create_landing_page_preview","title":"Create landing page preview","description":"Create a complete landing page preview in a single Convika call. Use this as the default tool for new LP creation after you have generated the final HTML.\n\nThis tool creates the site shell, assigns the requested URL/path when provided, sets conversion goals, saves the HTML content as the first version, and creates a token-protected preview URL. It avoids multi-step approval prompts in MCP clients.\n\nForms: create_form needs the siteId this tool returns, so a form can't be embedded in this first call. Leave the form out (or keep a placeholder section), then call create_form with the returned siteId, save the HTML with the form embed via save_page_content, and call create_preview so the preview shows the working form.\n\nDo not use publish_site unless the user explicitly asks to publish/go live in production.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name for the site"},"subdomain":{"type":"string","minLength":3,"maxLength":63,"pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?$","description":"Managed Convika fallback subdomain. Do not replace a requested path with this."},"url":{"description":"Optional exact custom URL requested by the user, for example 'https://www.example.com/lp2' or 'www.example.com/lp2'.","type":"string"},"locale":{"default":"en","description":"Language for the site content.","type":"string","enum":["en","ja"]},"industry":{"description":"Landing page industry.","type":"string","enum":["saas","ec","service","event","general"]},"purpose":{"description":"Landing page purpose.","type":"string","enum":["awareness","consideration","conversion","retention"]},"targetAudience":{"description":"Who the page is for, in one sentence (e.g. 'office workers near Shibuya station'). Saved on the site; get_site returns it.","type":"string","maxLength":500},"productSummary":{"description":"What the page promotes, in one or two sentences. Saved on the site; get_site returns it.","type":"string","maxLength":500},"primaryOffer":{"description":"The main offer or CTA promise, such as a free trial, demo, consultation, or purchase. Saved on the site; get_site returns it.","type":"string","maxLength":500},"goals":{"description":"Optional conversion goals to configure before preview creation.","minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"goalType":{"type":"string","enum":["form_submission","cta_click"]},"label":{"type":"string"},"config":{"type":"object","properties":{"ctaHrefPattern":{"type":"string"}}}},"required":["goalType","label"]}},"html":{"type":"string","description":"Complete HTML document using Tailwind CSS v3. Must include the Tailwind CDN script in <head>. The page (html, css, and js together) can be up to 2 MB."},"css":{"description":"Custom CSS for styles Tailwind cannot express.","type":"string"},"js":{"description":"JavaScript for interactive elements.","type":"string"},"changelog":{"description":"Description of this initial version.","type":"string"},"sections":{"description":"Sections in the page, matching <section> order in the HTML. Prefer providing real descriptions; if omitted, Convika synthesizes placeholder section metadata from the HTML.","type":"array","items":{"type":"object","properties":{"description":{"type":"string","minLength":20},"sequencePosition":{"type":"integer","minimum":0,"maximum":9007199254740991},"patternId":{"type":"string"},"layoutType":{"type":"string"},"foldPosition":{"type":"string","enum":["above","below"]},"relativeY":{"type":"number","minimum":0},"relativeX":{"type":"number","minimum":0},"widthRatio":{"type":"number","minimum":0,"maximum":1},"heightVh":{"type":"number","exclusiveMinimum":0},"isFixed":{"type":"boolean"},"options":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["description","sequencePosition"]}},"patterns":{"description":"Pattern metadata. Accepted for backward compatibility; prefer sections.","type":"array","items":{"type":"object","properties":{"patternId":{"type":"string"},"position":{"type":"integer","minimum":0,"maximum":9007199254740991},"options":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["patternId","position"]}},"designProfileId":{"description":"Optional design profile ID.","type":"string"},"designOverrides":{"description":"Optional bounded design knob overrides.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":-2,"maximum":2}},"designRationale":{"description":"Short design rationale.","type":"string"}},"required":["name","subdomain","html"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Create landing page preview"},"execution":{"taskSupport":"forbidden"}},{"name":"create_landing_page","title":"Create landing page","description":"Create a hosted landing page site shell with CDN, SSL, aggregate analytics, forms, and versioning. ランディングページ・LP・ホームページ・Webサイト・キャンペーンページの作成。\n\n\tIf the user requested a specific full URL or path URL such as https://www.example.com/lp2, pass it in the url argument. Do not turn the requested path into a Convika subdomain.\n\n\tAfter creation, use save_page_content to add HTML, then create_preview so the user can review it before production. Do not call publish_site unless the user explicitly asks to publish or go live.\n\n\tThis tool is equivalent to create_site — use either one.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name for the site (e.g. 'Spring Campaign 2026')"},"subdomain":{"type":"string","minLength":3,"maxLength":63,"pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?$","description":"Managed Convika fallback subdomain. Do not use this as a replacement for a user-requested custom URL path. Lowercase alphanumeric and hyphens only."},"url":{"description":"Optional exact custom URL requested by the user, for example 'https://www.example.com/' or 'https://www.example.com/lp2'. If provided, Convika assigns this URL to the site after creating the fallback subdomain.","type":"string"},"locale":{"default":"en","description":"Language for the site content. Defaults to 'en' (English)","type":"string","enum":["en","ja"]},"industry":{"description":"Industry of the landing page (e.g. 'saas', 'ec', 'service', 'event', 'general')","type":"string","enum":["saas","ec","service","event","general"]},"purpose":{"description":"Purpose of the landing page (e.g. 'awareness', 'consideration', 'conversion', 'retention')","type":"string","enum":["awareness","consideration","conversion","retention"]},"targetAudience":{"description":"Who the page is for, in one sentence (e.g. 'office workers near Shibuya station'). Saved on the site; get_site returns it.","type":"string","maxLength":500},"productSummary":{"description":"What the page promotes, in one or two sentences. Saved on the site; get_site returns it.","type":"string","maxLength":500},"primaryOffer":{"description":"The main offer or CTA promise, such as a free trial, demo, consultation, or purchase. Saved on the site; get_site returns it.","type":"string","maxLength":500}},"required":["name","subdomain"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Create landing page"},"execution":{"taskSupport":"forbidden"}},{"name":"list_sites","title":"List sites","description":"List all landing page sites (ランディングページ一覧) owned by the user on Convika.\n\nWhen the user asks about their existing pages, wants to edit or check a page, or you need a siteId for any operation, call this tool first.\nReturns each site's id, name, subdomain, locale, status (draft/published), and public URL.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"limit":{"description":"Maximum number of sites to return","type":"number"}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"List sites"},"execution":{"taskSupport":"forbidden"}},{"name":"get_site","title":"Get site details","description":"Get detailed information about a specific Convika site, including saved versions, published URL, and current status.\n\n\tCall this before editing or publishing to understand the site's current state. The response includes version history (retention: Free: 10, Pro: 50, Max: unlimited) and the live URL.\n\tTypical flow: list_sites → get_site → save_page_content → create_preview → wait for user approval → publish_site.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to retrieve"}},"required":["siteId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get site details"},"execution":{"taskSupport":"forbidden"}},{"name":"create_site","title":"Create site","description":"Create a hosted landing page site shell with analytics, forms, and versioning. ランディングページ作成、LP作成、ホームページ作成、ページ作成。Equivalent to create_landing_page.\n\nIf the user requested a specific full URL or path URL such as https://www.example.com/lp2, pass it in the url argument. Do not turn the requested path into a Convika subdomain.\n\nAfter creation, use save_page_content to add HTML (Tailwind CSS v3), then create_preview for user review. Only use publish_site after the user explicitly asks to publish/go live. Convika handles hosting, SSL, CDN, and custom subdomains automatically.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name for the site (e.g. 'Spring Campaign 2026')"},"subdomain":{"type":"string","minLength":3,"maxLength":63,"pattern":"^[a-z0-9]([a-z0-9-]*[a-z0-9])?$","description":"Managed Convika fallback subdomain. Do not use this as a replacement for a user-requested custom URL path. Lowercase alphanumeric and hyphens only."},"url":{"description":"Optional exact custom URL requested by the user, for example 'https://www.example.com/' or 'https://www.example.com/lp2'. If provided, Convika assigns this URL to the site after creating the fallback subdomain.","type":"string"},"locale":{"default":"en","description":"Language for the site content. Defaults to 'en' (English)","type":"string","enum":["en","ja"]},"industry":{"description":"Industry of the landing page (e.g. 'saas', 'ec', 'service', 'event', 'general')","type":"string","enum":["saas","ec","service","event","general"]},"purpose":{"description":"Purpose of the landing page (e.g. 'awareness', 'consideration', 'conversion', 'retention')","type":"string","enum":["awareness","consideration","conversion","retention"]},"targetAudience":{"description":"Who the page is for, in one sentence (e.g. 'office workers near Shibuya station'). Saved on the site; get_site returns it.","type":"string","maxLength":500},"productSummary":{"description":"What the page promotes, in one or two sentences. Saved on the site; get_site returns it.","type":"string","maxLength":500},"primaryOffer":{"description":"The main offer or CTA promise, such as a free trial, demo, consultation, or purchase. Saved on the site; get_site returns it.","type":"string","maxLength":500}},"required":["name","subdomain"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Create site"},"execution":{"taskSupport":"forbidden"}},{"name":"update_site","title":"Update site settings","description":"Update a Convika site's display name or language setting. The subdomain cannot be changed after creation.\n\nUse this when the user wants to rename a site or switch its locale (ja/en).","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to update"},"name":{"description":"New display name for the site","type":"string","minLength":1,"maxLength":100},"locale":{"description":"New language for the site content ('ja' or 'en')","type":"string","enum":["en","ja"]}},"required":["siteId"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Update site settings"},"execution":{"taskSupport":"forbidden"}},{"name":"save_page_content","title":"Save page content","description":"Save a new version of a Convika landing page's HTML. ページ内容の保存・更新・デザイン変更。\n\nEach call adds a new version. The live page and the current preview link don't change until you call create_preview (and publish_site, when the user asks), so call create_preview after saving for the user to review.\n\nVersion history: each plan keeps a limited number of saved versions (Free: 10, Pro: 50, MAX and Enterprise: unlimited). When a save goes over that limit, the oldest saved version is deleted permanently and can't be restored with rollback_site. The live version and the version behind the current preview link are never deleted.\n\nWorkflow: create_site (if new) → save_page_content → create_preview. Use publish_site only after explicit user approval to go live.\nAdding a form to a new page: create_landing_page_preview → create_form → save_page_content with the form embed → create_preview.\n\nUse \"sections\" to describe each <section> in your HTML. Each section needs a \"description\" (what it does and why, at least 20 characters) and a \"sequencePosition\" (0-indexed, matching <section> order). The \"patterns\" parameter is also accepted for backward compatibility.\n\nHTML guidelines:\n- Complete HTML document (<!DOCTYPE html>...) with Tailwind CSS v3\n- Include in <head>: <script src=\"https://cdn.tailwindcss.com\"></script>\n- Each section MUST be wrapped in a <section> tag (for content tracking)\n- css parameter: only for styles Tailwind cannot express\n- js parameter: Pro plan and above only\n- If the site has cta_click goals (check with list_goals), add data-cta=\"primary\" to the main CTA buttons/links for accurate conversion tracking","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to save content to"},"html":{"type":"string","description":"Complete HTML document using Tailwind CSS v3 utility classes. Must include Tailwind CDN script in <head>. The page (html, css, and js together) can be up to 2 MB."},"css":{"description":"Custom CSS for styles that cannot be expressed with Tailwind utilities","type":"string"},"js":{"description":"JavaScript for interactive elements (Pro plan and above only)","type":"string"},"changelog":{"description":"Description of changes in this version","type":"string"},"sections":{"description":"Sections in the page. Each describes a <section> in the HTML with its purpose, position, and optional layout geometry used for optimization and DCNv3 features.","type":"array","items":{"type":"object","properties":{"description":{"type":"string","minLength":20,"description":"What this section does and why (e.g. 'Hero section with product tagline and signup CTA button targeting SaaS developers'). At least 20 characters."},"sequencePosition":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Position of this section in the page (0-indexed, matching <section> order in HTML)"},"patternId":{"description":"Pattern ID, if this section uses a pattern template","type":"string"},"layoutType":{"description":"Layout type: 'centered', 'split', 'grid', etc.","type":"string"},"foldPosition":{"description":"Whether this section is above or below the fold","type":"string","enum":["above","below"]},"relativeY":{"description":"Normalized top offset of the section within the page layout","type":"number","minimum":0},"relativeX":{"description":"Normalized left offset of the section within the page layout","type":"number","minimum":0},"widthRatio":{"description":"Approximate width occupied by the section, normalized to 0..1","type":"number","minimum":0,"maximum":1},"heightVh":{"description":"Approximate section height in viewport-height units","type":"number","exclusiveMinimum":0},"isFixed":{"description":"Whether the section is fixed or sticky during scroll","type":"boolean"},"options":{"description":"Pattern-specific options (e.g. { layout: 'centered', background: 'dark' })","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["description","sequencePosition"]}},"patterns":{"description":"Patterns used in this page. Accepted for backward compatibility — prefer sections instead.","type":"array","items":{"type":"object","properties":{"patternId":{"type":"string","description":"Pattern ID (e.g. 'hero-standard', 'social-proof-logos')"},"position":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Position of this pattern in the page (0-indexed, matching <section> order in HTML)"},"options":{"description":"Pattern-specific options (e.g. { layout: 'centered', background: 'dark' })","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["patternId","position"]}},"designProfileId":{"description":"Optional design profile ID.","type":"string"},"designOverrides":{"description":"Optional bounded design knob overrides. Supported keys: ctaEmphasis, visualDensity, contrastStrength, motionIntensity, cornerRoundness, shadowDepth, trustSignalDensity, proofProminence.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":-2,"maximum":2}},"designRationale":{"description":"Short explanation for why this design profile or override set was chosen.","type":"string"}},"required":["siteId","html"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Save page content"},"execution":{"taskSupport":"forbidden"}},{"name":"create_preview","title":"Create preview link","description":"Generate a shareable preview URL for a landing page before going live.\n\n\tUse this after save_page_content so the user can review the page via a token-protected preview URL before publishing. The live production version is NOT affected.\n\tIf the site has an assigned primary custom URL such as https://www.example.com/lp2, the preview response uses that URL path and may also include a managed fallback URL.\n\tIf the user is happy with the preview, call publish_site to make it live.\n\tUses the latest saved version if versionNumber is omitted.\n\tThe returned URL includes a secure access token (valid for 7 days). Share this URL with stakeholders for review.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to preview"},"versionNumber":{"description":"Version number to preview. If omitted, the latest saved version is used.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["siteId"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Create preview link"},"execution":{"taskSupport":"forbidden"}},{"name":"publish_site","title":"Publish site","description":"Deploy a landing page to preview or production. ページ公開・デプロイ。\n\n\tFor normal creation/editing, prefer create_preview first so the user can review changes.\n\t- \"preview\" slot (default): creates a token-protected preview URL without affecting the live version\n\t- \"production\" slot: makes the page publicly accessible at the assigned primary URL if one exists, otherwise at the managed https://{subdomain}.convika.com fallback\n- Production requires confirmProduction=true and should only be used when the user explicitly asks to publish/go live\n- If versionNumber is omitted, the latest saved version is published\n- Convika handles hosting, CDN, and SSL automatically\n- The response includes a \"warnings\" array with preflight checks: missing goals, meta description, OGP tags, or forms. Inform the user of any warnings and offer to fix them (use set_goals for goals, save_page_content for meta tags, create_form for forms).","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to publish"},"slot":{"default":"preview","description":"Deployment slot. Defaults to 'preview'. 'production' makes the page live and requires confirmProduction=true.","type":"string","enum":["production","preview"]},"confirmProduction":{"default":false,"description":"Set true only when the user explicitly asked to publish/go live in production.","type":"boolean"},"versionNumber":{"description":"Version number to publish. If omitted, the latest saved version is used.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["siteId"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"title":"Publish site"},"execution":{"taskSupport":"forbidden"}},{"name":"rollback_site","title":"Roll back site","description":"Instantly revert a live landing page to a previous version.\n\nUse this when the user wants to undo a recent change or restore an earlier version of their page.\n- Call get_site first to see available version numbers\n- Only affects the production (live) slot\n- Versions beyond the plan's retention limit are pruned and unavailable (Free: 10, Pro: 50, Max: unlimited)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to rollback"},"versionNumber":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The version number to roll back to"}},"required":["siteId","versionNumber"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"title":"Roll back site"},"execution":{"taskSupport":"forbidden"}},{"name":"unpublish_site","title":"Unpublish site","description":"Take a live landing page offline. The page will no longer be publicly accessible.\n\nUse when the user wants to temporarily or permanently remove a page from the internet.\nAll content and versions are preserved — call publish_site anytime to bring it back online.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to unpublish"}},"required":["siteId"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"title":"Unpublish site"},"execution":{"taskSupport":"forbidden"}},{"name":"get_portfolio_analytics","title":"Get analytics for all sites","description":"Get a performance overview of ALL landing pages at once — pageviews, visitors, CTA clicks, and form submissions for every site.\n\nUse when the user asks about overall performance, wants a summary of all pages, or says something like \"how are my pages doing?\" or \"show me all LP performance\".\nReturns a flat table-friendly summary with key metrics per site. No siteId needed — automatically fetches all sites.\nFor detailed analytics on a specific page, use get_analytics_summary or get_analytics_detail instead.\nPeriods: 7d (default), 30d, 90d. Long-term periods are not available for portfolio view.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"period":{"default":"7d","description":"Time period for the analytics summary.","type":"string","enum":["7d","30d","90d"]},"botFilter":{"default":"exclude","description":"Whether to exclude known bots and vulnerability scanner traffic. Defaults to exclude. Use include only for diagnostics.","type":"string","enum":["exclude","include"]}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get analytics for all sites"},"execution":{"taskSupport":"forbidden"}},{"name":"get_analytics_summary","title":"Get analytics summary","description":"Check how a landing page is performing — pageviews, visitors, CTA clicks, referrers, and more.\n\nUse when the user asks about traffic, performance, conversions, or how their page is doing.\nReturns daily breakdown, top pages, referrers, and country data.\n- Short-term periods: 7d (default), 30d, 90d\n- Long-term periods: 180d, 365d, all (Pro/Max only)\nFor deeper analysis (device breakdown, UTM, hourly data, period comparison), use get_analytics_detail instead.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to get analytics for"},"period":{"default":"7d","description":"Time period for the analytics summary. 180d/365d/all require Pro or Max plan.","type":"string","enum":["7d","30d","90d","180d","365d","all"]},"botFilter":{"default":"exclude","description":"Whether to exclude known bots and vulnerability scanner traffic. Defaults to exclude. Use include only for diagnostics.","type":"string","enum":["exclude","include"]}},"required":["siteId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get analytics summary"},"execution":{"taskSupport":"forbidden"}},{"name":"get_analytics_detail","title":"Get analytics breakdown","description":"Deep-dive analytics with period comparison, device breakdown, UTM tracking, and CTA click analysis.\n\nUse when the user wants to optimize campaigns, evaluate traffic sources, or understand user behavior in detail.\nIncludes everything from get_analytics_summary PLUS:\n- CTA click breakdown (which buttons get clicked most)\n- Device breakdown (mobile/desktop/tablet)\n- UTM parameter analysis (source, medium, campaign)\n- Period-over-period comparison with change percentages\n- Hourly breakdown (short-term only)\nPeriods: 7d (default), 30d, 90d | 180d, 365d, all (Pro/Max only)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to get detailed analytics for"},"period":{"default":"7d","description":"Time period for the analytics detail. 180d/365d/all require Pro or Max plan.","type":"string","enum":["7d","30d","90d","180d","365d","all"]},"botFilter":{"default":"exclude","description":"Whether to exclude known bots and vulnerability scanner traffic. Defaults to exclude. Use include only for diagnostics.","type":"string","enum":["exclude","include"]}},"required":["siteId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get analytics breakdown"},"execution":{"taskSupport":"forbidden"}},{"name":"analyze_site_performance","title":"Diagnose site performance","description":"Analyze a landing page's aggregate analytics and return a compact diagnosis with prioritized next actions.\n\nUse when the user asks what to improve, why conversions changed, whether traffic quality is healthy, or what to test next.\nThis tool does NOT return raw event logs or form submission payloads. It returns aggregate metrics, top drivers, findings, evidence, and recommendations.\nPeriods: 7d (default), 30d, 90d | 180d, 365d, all (Pro/Max only).","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to analyze"},"period":{"default":"7d","description":"Time period for the diagnosis. 180d/365d/all require Pro or Max plan.","type":"string","enum":["7d","30d","90d","180d","365d","all"]},"botFilter":{"default":"exclude","description":"Whether to exclude known bots and vulnerability scanner traffic. Defaults to exclude. Use include only for diagnostics.","type":"string","enum":["exclude","include"]}},"required":["siteId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Diagnose site performance"},"execution":{"taskSupport":"forbidden"}},{"name":"analyze_source_quality","title":"Compare traffic sources","description":"Analyze traffic source quality using aggregate source/UTM metrics and attributed conversion events.\n\nUse when the user asks which referrers, campaigns, UTM sources, mediums, or campaigns are working.\nReturns source-level pageviews, visitors, CTA clicks, form submits, converting visitors, conversion rate, and attribution coverage summary. It does NOT return raw event logs or form submission payloads.\nA click or form submit counts toward the referrer or UTM value on the page where it happened, and a visitor who both clicks and submits counts once. \"(direct)\" means no referrer and \"(none)\" means no UTM tag; attributionCoverageRate is the share of visitors that have one.\nData covers the last 3 months and excludes known bots and vulnerability scanners, the same as get_analytics_summary. Dates are YYYY-MM-DD (UTC).","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to analyze"},"startDate":{"type":"string","description":"Start date (YYYY-MM-DD)"},"endDate":{"type":"string","description":"End date (YYYY-MM-DD)"},"dimension":{"default":"referrer","description":"Source dimension to group by. Defaults to referrer.","type":"string","enum":["referrer","utm_source","utm_medium","utm_campaign"]},"limit":{"default":20,"description":"Maximum source rows to return. Defaults to 20, max 100.","type":"integer","minimum":1,"maximum":100}},"required":["siteId","startDate","endDate"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Compare traffic sources"},"execution":{"taskSupport":"forbidden"}},{"name":"set_site_url","title":"Set site URL","description":"Assign a full URL to a Convika landing page, including custom-domain paths such as https://www.example.com/ or https://www.example.com/lp2.\n\n\tUse this when the user asks to create, move, preview, or publish a page at a specific URL. Prefer this over setup_custom_domain when a path is included.\n\t- The URL must be a subdomain URL, not a root/apex domain like example.com.\n\t- If the hostname is new, Convika creates the custom-domain claim and returns the CNAME routing record plus TXT ownership record.\n\t- If the hostname is already connected to this workspace, Convika only adds the path route. An active hostname needs no DNS work. A hostname still pending verification keeps the CNAME and TXT values from its first setup: the response repeats them, and the TXT value stays the same across calls.\n\t- invalid_hostname means the hostname can't be used as a custom domain (for example, reserved names such as anything.example.com). Ask the user for a hostname on a domain they own. It is not a DNS delay and not a Convika-side fault.\n\t- If another workspace has a pending claim, Convika can still start DNS control verification for this workspace; pending claims are not ownership.\n\t- If another workspace actively manages the hostname, do not take over automatically. Explain the options: ask for an invite, use another hostname, or explicitly start DNS control verification and activate handover.\n\t- Path routing is exact: /lp2 and /lp2/ normalize to the same route, but /lp2/thanks is a different route.\n\t- After this tool succeeds, use create_preview; the preview response can use the assigned URL path.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to assign the URL to"},"url":{"type":"string","description":"The full URL to assign, for example 'https://www.example.com/' or 'https://www.example.com/lp2'. Query strings and hashes are ignored."},"makePrimary":{"default":true,"description":"Whether this URL should become the site's canonical/primary URL.","type":"boolean"}},"required":["siteId","url"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Set site URL"},"execution":{"taskSupport":"forbidden"}},{"name":"start_domain_control_verification","title":"Start domain ownership check","description":"Start explicit DNS control verification for a custom-domain URL that is managed or pending in another Convika workspace.\n\n\tUse this only after telling the user that:\n\t- Existing URLs on the hostname will remain served if handover is later activated.\n\t- Existing page data, forms, analytics, and history will not move to this workspace.\n\t- New URL creation on the hostname requires explicit handover activation after DNS TXT verification.\n\tThis tool returns a TXT record. The user must add that TXT record at their DNS provider.\n\tOnly for hostnames another workspace holds — set_site_url returns domain_control_verification_required for those. For a hostname no other workspace holds, or one this workspace already has, this tool starts nothing and returns domain_control_verification_not_needed; use set_site_url (full URL) or setup_custom_domain (hostname) instead.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site that should receive the URL after handover activation"},"url":{"type":"string","description":"The full custom-domain URL, such as https://www.example.com/lp2"}},"required":["siteId","url"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Start domain ownership check"},"execution":{"taskSupport":"forbidden"}},{"name":"check_domain_control_verification","title":"Check domain ownership","description":"Check whether the DNS TXT record for a Convika domain control verification attempt has propagated.\n\n\tIf still pending, tell the user to keep the TXT record in DNS and check again shortly. Do not activate handover until this tool reports verified.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"attemptId":{"type":"string","description":"The domain verification attempt ID returned by start_domain_control_verification"}},"required":["attemptId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Check domain ownership"},"execution":{"taskSupport":"forbidden"}},{"name":"activate_domain_handover","title":"Activate domain handover","description":"Activate custom-domain control handover after DNS TXT verification has completed.\n\n\tUse only after explicit user confirmation. Activation changes future control of the hostname to this workspace. Existing URLs remain served as frozen continuity routes; existing page data, forms, analytics, and history are not copied into this workspace. The user can later replace or disable legacy paths explicitly.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"attemptId":{"type":"string","description":"The verified domain control attempt ID to activate"}},"required":["attemptId"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"title":"Activate domain handover"},"execution":{"taskSupport":"forbidden"}},{"name":"list_domain_routes","title":"List domain routes","description":"List all routes under a custom domain, including frozen continuity routes left behind after domain handover.\n\nUse after activate_domain_handover when the user wants to inspect, disable, or replace existing paths on the hostname.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"domainId":{"type":"string","description":"The domain ID returned by get_domain_status or activate_domain_handover"}},"required":["domainId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"List domain routes"},"execution":{"taskSupport":"forbidden"}},{"name":"disable_domain_route","title":"Disable domain route","description":"Disable one custom-domain route.\n\nUse only after explicit user confirmation. This stops Convika from serving that exact path after the route map updates. To replace a legacy frozen path, disable it first, then call set_site_url for the new site and same URL.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"routeId":{"type":"string","description":"The route ID returned by list_domain_routes"}},"required":["routeId"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"title":"Disable domain route"},"execution":{"taskSupport":"forbidden"}},{"name":"setup_custom_domain","title":"Connect custom domain","description":"Connect the user's own subdomain (e.g. www.example.com or landing.example.com) to a Convika landing page.\n\nUse when the user wants their page accessible on their own domain instead of {subdomain}.convika.com.\nReturns the CNAME record for routing and TXT record for ownership verification. After DNS setup, SSL is automatically provisioned.\n- Available on all plans. Free: 1 custom domain, Pro/Max: unlimited.\n- Standard flow: connect a www hostname first, then ask the user to add the returned CNAME and TXT records.\n- If the user asks for a brand/root domain such as example.com, use www.example.com as the canonical hostname. Do not start a DNS-provider discussion during initial setup.\n- Root/no-www access is optional follow-up work. Keep initial setup focused on the www CNAME unless the user explicitly asks for no-www support.\n- If the tool returns domain_provider_error, tell the user this is a Convika-side provider provisioning failure. Do not tell the user to wait for DNS propagation or change DNS records until Convika fixes the provider error.\n- If the tool returns invalid_hostname, the hostname itself can't be used (for example, reserved names such as anything.example.com). Ask the user for a hostname on a domain they own and call this tool again with it.\n- Call get_domain_status to check verification progress after DNS setup","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to add a custom domain to"},"hostname":{"type":"string","description":"The custom domain hostname (e.g. 'www.example.com' or 'landing.example.com'). Must be a subdomain, not a root/apex domain like 'example.com'."}},"required":["siteId","hostname"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Connect custom domain"},"execution":{"taskSupport":"forbidden"}},{"name":"get_domain_status","title":"Get domain status","description":"Check whether a custom domain is verified and SSL is active.\n\nUse after setup_custom_domain to monitor progress, or when the user asks about their domain status.\nShows domain verification status and SSL certificate status. If still pending, includes DNS configuration instructions.\nStatus flow: pending_verification → active.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to check domain status for"}},"required":["siteId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get domain status"},"execution":{"taskSupport":"forbidden"}},{"name":"create_form","title":"Create form","description":"Add a contact form, email signup, or lead capture form to a landing page.\n\nUse when the user wants to collect submissions from visitors (e.g. \"add a contact form\", \"collect emails\", \"add a signup form\"). Convika handles submission storage, spam protection (honeypot), and optional email notifications automatically.\n\tAfter creating the form, embed it in the page HTML using save_page_content with the returned form ID, then call create_preview so the preview shows the form. Use get_form_submissions to view collected production data. Preview submissions validate the form but are not stored and do not trigger webhooks.\n\tA form needs an existing siteId. For a brand-new page, call create_landing_page_preview first (it returns the siteId), then this tool, then save_page_content with the embed, then create_preview.\nAvailable on all plans. Free: 50 submissions/month, Pro/Max: unlimited.\n\nHTML embed example (use JavaScript fetch, NOT <form action=\"...\"> with method=\"POST\"):\n<form id=\"form-{formId}\" onsubmit=\"return false;\">\n  <input type=\"hidden\" name=\"_hp\" value=\"\" style=\"display:none\">\n  <!-- Add <input>/<textarea> for each field, using the field id as the name attribute -->\n  <button type=\"submit\">Submit</button>\n</form>\n<script>\n(function(){\n  var form = document.getElementById('form-{formId}');\n  function qs(name){ try { return (new URLSearchParams(location.search)).get(name) || ''; } catch(e) { return ''; } }\n  form.addEventListener('submit', function(e){\n    e.preventDefault();\n    var btn = form.querySelector('button[type=\"submit\"]');\n    btn.disabled = true;\n    // Collect answers as the browser would submit them: no disabled fields, buttons, or files;\n    // checkboxes and radios only when checked; every selected option of a <select>.\n    var data = {};\n    var els = form.querySelectorAll('input[name],select[name],textarea[name]');\n    for (var i = 0; i < els.length; i++) {\n      var el = els[i], name = el.name, type = el.type, values = [];\n      if (!name || name === '_hp' || el.matches(':disabled') || /^(file|submit|button|reset|image)$/.test(type)) continue;\n      if ((type === 'checkbox' || type === 'radio') && !el.checked) continue;\n      if (el.tagName === 'SELECT') {\n        for (var j = 0; j < el.options.length; j++) {\n          if (el.options[j].selected && !el.options[j].disabled) values.push(el.options[j].value);\n        }\n      } else {\n        values.push(el.value);\n      }\n      // A name used more than once (a checkbox group, a multiple <select>) joins its answers with ', '.\n      for (var k = 0; k < values.length; k++) {\n        var prev = typeof data[name] === 'string' ? data[name] : '';\n        data[name] = prev && values[k] ? prev + ', ' + values[k] : prev || values[k];\n      }\n    }\n    var siteVersionMeta = document.querySelector('meta[name=\"cvk:site-version\"]');\n    var renderHashMeta = document.querySelector('meta[name=\"cvk:render-hash\"]');\n    var slot = location.search.indexOf('slot=preview') > -1 ? 'preview' : 'production';\n    fetch('/_form', {\n      method: 'POST',\n      headers: {'Content-Type': 'application/json'},\n      body: JSON.stringify({formId: '{formId}', data: data, _hp: form.querySelector('[name=\"_hp\"]').value, pathname: location.pathname, slot: slot, siteVersion: siteVersionMeta ? parseInt(siteVersionMeta.content, 10) : undefined, renderHash: renderHashMeta ? renderHashMeta.content : undefined, referrer: (document.referrer || '').slice(0, 500), utmSource: qs('utm_source').slice(0, 100), utmMedium: qs('utm_medium').slice(0, 100), utmCampaign: qs('utm_campaign').slice(0, 150)})\n    }).then(function(r){ return r.json(); }).then(function(res){\n      if (res.success) {\n        form.innerHTML = '<p>{successMessage || \"Thank you!\"}</p>';\n      } else {\n        alert(res.message || 'Submission failed');\n        btn.disabled = false;\n      }\n    }).catch(function(){ alert('Network error'); btn.disabled = false; });\n  });\n})();\n</script>\n\nIMPORTANT: Replace {formId} with the actual form ID. Replace {successMessage} with the form's successMessage or a suitable thank-you message. Do NOT use <form method=\"POST\" action=\"...\"> — always use the JavaScript fetch approach above to submit to /_form.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the site to create the form for"},"fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique field identifier (e.g. 'name', 'email', 'message')"},"label":{"type":"string","description":"Display label for the field"},"type":{"type":"string","enum":["text","email","textarea"],"description":"Field type: text, email, or textarea"},"required":{"type":"boolean","description":"Whether the field is required"},"placeholder":{"description":"Placeholder text","type":"string"}},"required":["id","label","type","required"]},"description":"Form fields configuration"},"notifyEmail":{"description":"Email address to receive submission notifications","type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"submitButtonLabel":{"description":"Custom label for the submit button (default: 'Submit')","type":"string"},"successMessage":{"description":"Message shown after successful submission","type":"string"}},"required":["siteId","fields"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Create form"},"execution":{"taskSupport":"forbidden"}},{"name":"set_goals","title":"Set conversion goals","description":"Set conversion goals for a landing page. Goals define what counts as a \"conversion\" —\nthe primary actions you want visitors to take. You can set multiple goals per site.\n\nConversion rate is calculated from unique visitors who completed at least one configured goal.\nEach goal is still tracked separately in analytics, and improvement suggestions adapt to goal types.\n\nExamples:\n- User says \"カフェの予約ページを作って\" → goals: [{ goalType: \"cta_click\", label: \"予約サイトへ\" }]\n- User says \"資料請求と LINE 登録ができるページ\" → goals: [\n    { goalType: \"form_submission\", label: \"資料請求フォーム\" },\n    { goalType: \"cta_click\", label: \"LINE登録\" }\n  ]\n\nIMPORTANT: Always call this after create_site when the page purpose is clear.\nIf the user mentions forms, inquiries, signups → include form_submission goal.\nIf the user mentions external links, bookings, LINE, phone, EC store → include cta_click goal.\nCalling this replaces all existing goals for the site.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID to set goals for"},"goals":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"goalType":{"type":"string","enum":["form_submission","cta_click"],"description":"'form_submission': visitors submit a form. 'cta_click': visitors click a CTA to an external destination."},"label":{"type":"string","description":"Human-readable name for this goal (e.g. '問い合わせフォーム', 'LINE登録', 'ECサイトへ')"},"config":{"type":"object","properties":{"ctaHrefPattern":{"description":"For cta_click: URL pattern to filter which clicks count (e.g. 'https://shop.example.com/*')","type":"string"}}}},"required":["goalType","label"]},"description":"List of conversion goals (1-5)"}},"required":["siteId","goals"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Set conversion goals"},"execution":{"taskSupport":"forbidden"}},{"name":"list_goals","title":"List conversion goals","description":"List the conversion goals configured for a landing page.\n\nUse when the user asks about their site's goals, wants to check what's being tracked as conversions,\nor before calling set_goals to see the current configuration.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID to list goals for"}},"required":["siteId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"List conversion goals"},"execution":{"taskSupport":"forbidden"}},{"name":"get_form_submissions","title":"Get form submissions","description":"View submissions collected by a landing page form.\n\nUse when the user wants to check leads, see who filled out their form, or review contact requests. Supports pagination and date filtering.\nReturns each submission's answers, country, spam score, and time. The submitter's IP address and browser details are not returned.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID that the form belongs to"},"formId":{"type":"string","description":"The form ID to get submissions for"},"limit":{"description":"Number of submissions to return (default: 50, max: 100)","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Number of submissions to skip (default: 0)","type":"integer","minimum":0,"maximum":9007199254740991},"startDate":{"description":"Filter submissions from this date (ISO 8601)","type":"string"},"endDate":{"description":"Filter submissions until this date (ISO 8601)","type":"string"}},"required":["siteId","formId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get form submissions"},"execution":{"taskSupport":"forbidden"}},{"name":"export_form_submissions","title":"Export form submissions","description":"Export all form submissions as CSV or JSON for use in spreadsheets, CRM, or other tools.\n\nUse when the user wants to download, export, or analyze their form data outside of Convika.\nThe export holds each submission's answers, country, spam score, and time. The submitter's IP address and browser details are not included.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID that the form belongs to"},"formId":{"type":"string","description":"The form ID to export submissions from"},"format":{"description":"Export format (default: csv)","type":"string","enum":["csv","json"]},"startDate":{"description":"Filter submissions from this date (ISO 8601)","type":"string"},"endDate":{"description":"Filter submissions until this date (ISO 8601)","type":"string"},"limit":{"default":1000,"description":"Maximum submissions to inline in the MCP response. Defaults to 1000, max 1000.","type":"integer","minimum":1,"maximum":1000},"offset":{"default":0,"description":"Number of submissions to skip for chunked exports.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["siteId","formId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Export form submissions"},"execution":{"taskSupport":"forbidden"}},{"name":"get_referral_link","title":"Get referral link","description":"Get your Convika referral link to share with friends, plus your referral statistics.\nA friend who signs up through your link starts on the Free plan with no card. When they first subscribe to a paid plan, you both get account credit.\nThe response's rewards field states exactly what each side gets, including the trial terms (the same ones create_claim_code reports). Quote it rather than paraphrasing or promising anything else.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get referral link"},"execution":{"taskSupport":"forbidden"}},{"name":"create_claim_code","title":"Create claim link","description":"Create a claim link for a landing page you built, so someone else can take ownership of it — no card required.\n\nThis powers the \"I built you a page\" outreach: you build and publish a landing page on your own account, then mint a claim link bound to that page. You share the link; when the recipient signs up through it, that exact page — same URL, same content, same live address they already saw — moves into their account immediately. Claiming is free: the recipient gets the Free plan with no card (the page stays live with a small \"Powered by Convika\" badge; analytics and starter AI-edit credits included). The response's recipientGets field states the exact terms; quote it when you tell the recipient what they get.\n- The page must already exist on your account. Build it with create_landing_page_preview, then publish_site to production so the recipient can see it live before they sign up.\n- The link is single-use and expires in 14 days by default — tell the recipient the deadline. An unclaimed showcase page is automatically unpublished about 30 days after the code was minted.\n- Ownership transfers without changing the URL, so the page you showed them in your message becomes theirs at the same address.\n- Returns the signup URL to send, plus the code and its limits.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The ID of the landing page to bind to the claim link. Must be a site on your account."},"maxClaims":{"description":"How many times the link can be claimed. Defaults to 1 (single-use).","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"expiresInDays":{"description":"Days until the link expires. Defaults to 14 (the claim window communicated to the recipient).","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["siteId"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Create claim link"},"execution":{"taskSupport":"forbidden"}},{"name":"query_timeseries","title":"Query traffic over time","description":"Daily pageviews and unique visitors for one landing page, optionally split by a dimension (device type, country, referrer, page path, UTM source/medium/campaign) and filtered to one device or country.\n\nUse when the user asks how traffic moved day by day, or which device, country, or source drove a change. For a one-call overview use get_analytics_summary; for period-over-period comparison use get_analytics_detail.\nEach row has date, dimensionValue (\"all\" when no dimension is set), pageviews, and visitors. Visitors are unique per day, so don't add them up across days.\nData covers the last 3 months and excludes known bots and vulnerability scanners, the same as get_analytics_summary. Scans count toward the monthly analytics scan quota and overage billing where applicable.\nDates must be valid calendar dates in YYYY-MM-DD format (UTC), and startDate must be on or before endDate.\nSupported filters are device (mobile, desktop, tablet) and country (two-letter code such as JP or US).\n\nCombine results with detect_trend to confirm trends.\n\nExamples:\n- Basic traffic: query_timeseries(siteId, \"2026-09-01\", \"2026-09-28\")\n- By device: query_timeseries(siteId, \"2026-09-01\", \"2026-09-28\", dimension=\"device\")\n- By UTM source: query_timeseries(siteId, \"2026-09-01\", \"2026-09-28\", dimension=\"utm_source\")\n- Mobile only: query_timeseries(siteId, \"2026-09-01\", \"2026-09-28\", filters={device:\"mobile\"})","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID to query"},"startDate":{"type":"string","description":"Start date (YYYY-MM-DD)"},"endDate":{"type":"string","description":"End date (YYYY-MM-DD)"},"dimension":{"description":"Optional dimension to break down results by","type":"string","enum":["device","country","referrer","pathname","utm_source","utm_medium","utm_campaign"]},"filters":{"description":"Optional filters to narrow results. Supported keys: device, country","type":"object","properties":{"device":{"type":"string"},"country":{"type":"string"}},"additionalProperties":false},"limit":{"default":100,"description":"Maximum rows to return. Defaults to 100, max 500.","type":"integer","minimum":1,"maximum":500}},"required":["siteId","startDate","endDate"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Query traffic over time"},"execution":{"taskSupport":"forbidden"}},{"name":"get_page_structure","title":"Get page structure","description":"Get the structural composition of a landing page version — sections, CTA placements, and conversion goals.\n\nReturns, in page order, the page-level <header>, each <section>, and the page-level <footer>, each with its id, first heading, and the CTAs inside it (text, link, type, and whether it is marked data-cta=\"primary\"). CTAs outside those elements are listed in ctasOutsideSections. CTA text matches what query_cta_performance reports, so you can tell where the clicked CTA sits.\nIf the version was saved with the sections argument of save_page_content, each section also carries that description, pattern ID, layout type, and fold position; otherwise those fields are null. sequencePosition matches sections[].sequencePosition in save_page_content.\nUse get_site for the saved HTML itself and version history.\nIf version is omitted, the current production version is used, then the latest saved version as fallback.\nIf the requested version does not exist, the tool returns version_not_found. If the site has no saved versions yet, it returns page_structure_unavailable.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID"},"version":{"description":"Specific version number. Defaults to current production version.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["siteId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get page structure"},"execution":{"taskSupport":"forbidden"}},{"name":"query_cta_performance","title":"Query CTA performance","description":"CTA-level click analytics with daily time series.\n\nEach row has date, CTA text, link, type (explicit for data-cta elements, link, or button), clicks, and unique clickers. Use when the user asks which buttons or links people click, or whether a CTA change worked; get_page_structure shows where each CTA sits on the page.\nScans count toward the monthly analytics scan quota and overage billing where applicable.\nDates must be valid calendar dates in YYYY-MM-DD format (UTC), and startDate must be on or before endDate.\nOptionally filter by exact CTA text or by a regular expression for the CTA href.\n\nCombine with query_timeseries for traffic context (clicks ÷ visitors = CTR).","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID"},"startDate":{"type":"string","description":"Start date (YYYY-MM-DD)"},"endDate":{"type":"string","description":"End date (YYYY-MM-DD)"},"ctaText":{"description":"Filter by exact CTA button text","type":"string"},"ctaHrefPattern":{"description":"Filter by CTA link pattern as a valid regular expression (e.g. 'https://shop\\\\.example\\\\.com/.*')","type":"string"},"limit":{"default":100,"description":"Maximum rows to return. Defaults to 100, max 500.","type":"integer","minimum":1,"maximum":500}},"required":["siteId","startDate","endDate"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Query CTA performance"},"execution":{"taskSupport":"forbidden"}},{"name":"query_segments","title":"Compare segments","description":"Compare two visitor segments side-by-side with daily time series.\n\nDefine two segments with different filters (e.g., mobile vs desktop, Japan vs US) and get parallel daily pageview/visitor data for each.\nData covers the last 3 months and excludes known bots and vulnerability scanners, the same as get_analytics_summary. Scans count toward the monthly analytics scan quota and overage billing where applicable.\nDates must be valid calendar dates in YYYY-MM-DD format (UTC), and startDate must be on or before endDate.\nSupported segment filters are device (mobile, desktop, tablet) and country (two-letter code such as JP or US).\n\nExample: segmentA={label:\"Mobile\", filters:{device:\"mobile\"}}, segmentB={label:\"Desktop\", filters:{device:\"desktop\"}}","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"siteId":{"type":"string","description":"The site ID"},"startDate":{"type":"string","description":"Start date (YYYY-MM-DD)"},"endDate":{"type":"string","description":"End date (YYYY-MM-DD)"},"segmentA":{"type":"object","properties":{"label":{"type":"string","description":"Human-readable segment label"},"filters":{"type":"object","properties":{"device":{"type":"string"},"country":{"type":"string"}},"additionalProperties":false,"description":"Supported filters: device, country"}},"required":["label","filters"]},"segmentB":{"type":"object","properties":{"label":{"type":"string","description":"Human-readable segment label"},"filters":{"type":"object","properties":{"device":{"type":"string"},"country":{"type":"string"}},"additionalProperties":false,"description":"Supported filters: device, country"}},"required":["label","filters"]},"limit":{"default":100,"description":"Maximum rows to return per segment. Defaults to 100, max 500.","type":"integer","minimum":1,"maximum":500}},"required":["siteId","startDate","endDate","segmentA","segmentB"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Compare segments"},"execution":{"taskSupport":"forbidden"}},{"name":"detect_trend","title":"Detect trend","description":"Mann-Kendall trend test — detect whether a time series is trending up, down, or stable.\n\nPass an array of ordered values (e.g., daily visitor counts from query_timeseries) to get a statistical determination of trend direction, strength (Kendall's tau), and significance (p-value). Also returns Sen's slope (change per time step).\ntrend is \"increasing\", \"decreasing\", or \"stable\"; \"stable\" means no significant trend at the given alpha.\n\nRequires at least 4 data points.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"values":{"minItems":4,"type":"array","items":{"type":"number"},"description":"Ordered time-series values (e.g., daily visitors)"},"alpha":{"default":0.05,"description":"Significance level (default 0.05)","type":"number","minimum":0,"maximum":1}},"required":["values"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Detect trend"},"execution":{"taskSupport":"forbidden"}}],"resources":[],"prompts":[]}