{"name":"VariFlask Agent","description":"AI-powered A/B testing research and experiment management. Analyze websites, generate CRO-informed test ideas, author variant code from natural-language prompts, manage experiments programmatically, and run always-on Continuous Loops that auto-optimize a page round-by-round.","url":"https://agent.variflask.com","version":"1.3.0","documentationUrl":"https://variflask.com/docs","iconUrl":"https://variflask.com/ab-test-bot-automate-icon.png","provider":{"organization":"VariFlask","url":"https://variflask.com"},"capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"authentication":{"schemes":[{"scheme":"bearer"}]},"skills":[{"id":"create_site","name":"create_site","description":"Register a new website in your workspace for A/B testing. Returns the site ID and the tracking snippet to install in the <head> of your site. The snippet is <1KB and synchronous (zero content flicker). If a site with the same domain already exists, the response conflict includes `existing_site` so the agent can use it without a second call; pass `reuse_if_exists: true` to treat duplicates as successful no-ops instead of conflicts. (5 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Add a new site","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"create_site","params":{"url":"https://example.com","name":"Example"}}}]}}},{"name":"Idempotent add","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"create_site","params":{"url":"https://example.com","reuse_if_exists":true}}}]}}}]},{"id":"list_sites","name":"list_sites","description":"List all websites registered in your workspace. Returns site IDs, names, URLs, platform, and crawl status. (1 credit)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"List all sites","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"list_sites","params":{}}}]}}}]},{"id":"get_site_intelligence","name":"get_site_intelligence","description":"Get AI-analyzed intelligence for a site: industry, business model, target audience, value propositions, brand tone, competitors, and top keywords. (2 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Read site intelligence","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"get_site_intelligence","params":{"site_id":"11111111-1111-1111-1111-111111111111"}}}]}}}]},{"id":"list_ideas","name":"list_ideas","description":"List A/B test ideas for a site. Each idea includes a `mockup` object with the rendered mockup image (`mockup.image_url`) and its render status. Mockups render asynchronously after generate_ideas, so a freshly generated idea starts at mockup.status=\"rendering\" and flips to \"ready\" once its image is available — poll this (or get_idea) until then. Un-renderable ideas are withheld. Optionally filter by status (new, approved, implemented, rejected, archived). (1 credit)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"List ideas (with mockup images) for a site","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"list_ideas","params":{"site_id":"11111111-1111-1111-1111-111111111111"}}}]}}}]},{"id":"get_idea","name":"get_idea","description":"Get a single A/B test idea by ID, including its rendered mockup image. Use this to re-poll an idea after generate_ideas: mockups render asynchronously, so an idea starts at mockup.status=\"rendering\" and flips to \"ready\" (with mockup.image_url set) once its variant screenshot is rendered and vision-confirmed. Returns the full idea plus a compact `mockup` summary. (1 credit)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Poll one idea for its mockup","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"get_idea","params":{"idea_id":"44444444-4444-4444-4444-444444444444"}}}]}}}]},{"id":"generate_ideas","name":"generate_ideas","description":"Use AI to analyze a site and generate new CRO-informed A/B test ideas. This performs a live AI analysis and may take 15-30 seconds. If the user names a concept or a part of the site they want tested, pass it as `focus` and every idea will be about it. Each returned idea carries a `mockup` object, but mockup images render ASYNCHRONOUSLY after this call returns: ideas come back with mockup.status=\"rendering\" and no image yet. Poll list_ideas or get_idea until mockup.status=\"ready\" to retrieve mockup.image_url. (10 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Generate 5 ideas","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"generate_ideas","params":{"site_id":"11111111-1111-1111-1111-111111111111","num_ideas":5}}}]}}},{"name":"Generate ideas around what the user asked for","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"generate_ideas","params":{"site_id":"11111111-1111-1111-1111-111111111111","num_ideas":3,"focus":"shipping and returns info on product pages"}}}]}}}]},{"id":"generate_variant","name":"generate_variant","description":"Generate A/B test variant code from a natural-language prompt. The service fetches the target page DOM and your site intelligence (industry, competitors, keywords), then uses AI to author the exact DOM mutations (selectors + actions + payloads) SplitKit needs to run the variant in the browser. Use when you know what to test but do not have a pre-existing idea from generate_ideas. After this returns, pass the resulting variant to create_experiment (mapping variant.mutations -> variants[0].changes). (10 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Author a variant from a prompt","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"generate_variant","params":{"site_id":"11111111-1111-1111-1111-111111111111","target_url":"https://example.com/pricing","prompt":"Change the hero price from $99 to $499 and update the CTA link to https://buy.stripe.com/pro"}}}]}}}]},{"id":"list_experiments","name":"list_experiments","description":"List A/B experiments for a site. Optionally filter by status (draft, active, paused, completed, archived). (1 credit)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"List running experiments","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"list_experiments","params":{"status":"running"}}}]}}}]},{"id":"get_experiment","name":"get_experiment","description":"Get full details for an experiment including all variants, goals, current results, and preview URLs for each non-control variant (`<target_url>?sk_preview=<variant_id>`). (2 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Read an experiment","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"get_experiment","params":{"experiment_id":"22222222-2222-2222-2222-222222222222"}}}]}}}]},{"id":"create_experiment","name":"create_experiment","description":"Create a new A/B experiment. Four ways to supply the variant: (1) pass `prompt` + optional `target_url` — the server runs generate_variant internally in one call (extra 10 credits deducted for the LLM work); (2) pass `variants[0].changes` (DOM mutations returned by a previous generate_variant call); (3) pass `idea_id` to pull mutations from an existing idea; (4) pass none for a draft experiment you will edit later in the dashboard. Pass `auto_launch: true` to transition the experiment to running immediately after creation (requires ≥2 variants and ≥1 goal). (5 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"One-shot prompt + auto-launch","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"create_experiment","params":{"site_id":"11111111-1111-1111-1111-111111111111","name":"Pro pricing $499","prompt":"Test bumping the price from $99 to $499 on /pricing","target_url":"https://example.com/pricing","auto_launch":true}}}]}}},{"name":"From a generate_variant payload","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"create_experiment","params":{"site_id":"11111111-1111-1111-1111-111111111111","name":"Hero CTA color","variants":[{"name":"Red CTA","changes":[{"selector":".hero-cta","action":"set_style","payload":"background:#e11d48"}]}],"goals":[{"name":"CTA click","type":"click","selector":".hero-cta"}]}}}]}}}]},{"id":"launch_experiment","name":"launch_experiment","description":"Transition a draft experiment to the running state — pushes the variant config to the SplitKit edge KV so the tracking snippet starts serving traffic. The experiment must have at least 2 variants (control + one test) and 1 goal. Use this right after create_experiment if the user approved the variant. Idempotent: calling on an already-running experiment succeeds without changes. (2 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Launch a draft","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"launch_experiment","params":{"experiment_id":"22222222-2222-2222-2222-222222222222"}}}]}}}]},{"id":"create_loop","name":"create_loop","description":"Start a Continuous Loop on a page — an always-on champion-challenger optimizer. Two-phase: omit `selected_idea_id` to get 3-5 seed-idea candidates (the agent picks one), then call again with `selected_idea_id` set to launch round 1. Element types are constrained to `headline` and `copy` in v1 (`image` and `layout` are coming soon). Free plan cannot create loops. (15 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Start a continuous loop","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"create_loop","params":{"site_id":"11111111-1111-1111-1111-111111111111","target_url":"https://example.com/pricing","primary_goal":{"name":"Checkout click","type":"click","selector":".checkout-btn"}}}}]}}}]},{"id":"pause_loop","name":"pause_loop","description":"Pause a running Continuous Loop. The current round's experiment is also paused (KV stops serving traffic). Idempotent: pausing an already-paused loop is a no-op. (2 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Pause a loop","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"pause_loop","params":{"loop_id":"33333333-3333-3333-3333-333333333333"}}}]}}}]},{"id":"resume_loop","name":"resume_loop","description":"Resume a paused Continuous Loop. Sets next_tick_at = now() so the next cron pass picks it up immediately; also resumes the current round's experiment so KV serves it again. Idempotent. (2 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Resume a loop","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"resume_loop","params":{"loop_id":"33333333-3333-3333-3333-333333333333"}}}]}}}]},{"id":"get_loop_status","name":"get_loop_status","description":"Read full status for a Continuous Loop: loop config + current round + last 10 rounds of history + the live loop decision (wait/hold/promote/inconclusive) including how many more samples and days are needed before the next decision. Use this to poll a loop's progress without burning credits on a full tick. (2 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"Check loop status","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"get_loop_status","params":{"loop_id":"33333333-3333-3333-3333-333333333333"}}}]}}}]},{"id":"get_docs","name":"get_docs","description":"Read VariFlask developer documentation. Call with no arguments to list every doc (table of contents). Call with `slug` to get the full markdown of that doc — e.g. `agent-gateway/tools`, `api/endpoints`, `continuous-loops`. Free (0 credits). Source-of-truth for everything the REST/MCP/A2A surfaces expose; agents should prefer reading these over guessing from tool names. (0 credits)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"List all docs (TOC)","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"get_docs","params":{}}}]}}},{"name":"Read the tool reference","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"get_docs","params":{"slug":"agent-gateway/tools"}}}]}}},{"name":"Read REST endpoint reference","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"get_docs","params":{"slug":"api/endpoints"}}}]}}}]},{"id":"search_knowledge","name":"search_knowledge","description":"Search VariFlask's curated CRO knowledge base. Returns research-backed findings with their original sources (peer-reviewed studies, industry reports, vendor case studies) so an agent can cite evidence when proposing experiments — e.g. \"CXL 2020 found button contrast matters more than color hue (source: ...)\". This is the same KB the generate_ideas tool injects into its LLM prompt. Pass a free-text `query` and/or a `category` filter. 1 credit per call. (1 credit)","inputModes":["application/json"],"outputModes":["application/json"],"examples":[{"name":"CTA button best practices","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"search_knowledge","params":{"query":"button color contrast"}}}]}}},{"name":"Form-field optimization, top 5","input":{"message":{"role":"user","parts":[{"type":"data","data":{"tool":"search_knowledge","params":{"query":"reduce form fields","category":"forms","limit":5}}}]}}}]}]}