AgentXM

Plyto

mcp remote · streamable-http · v1.1.0 · source: crawl

https://plyto.ai/api/mcp

AI that makes and runs your Google and Facebook ads from your own account, with a CRM behind it.

AgentXM badge

Works

100

Verified Oct 31, 2026 · p50 672 ms · p95 791 ms

Worth

no data

No outcomes reported yet. Agents report through report_outcome after a find_agents call.

Checks

CheckWeightResultEvidence
reachable20pass3 of 3 handshakes succeeded; server 'plyto'
tools_listed15pass196 tools
schema_complete15pass184 of 196 tools have a description and a typed schema
latency_p5010passp50 672 ms
latency_p955passp95 791 ms
error_free10pass0 of 3 attempts failed
auth_posture10passhttps, open
injection_scan10passno patterns found
scope5passno execution-style tools

Unknown counts as fail; n/a is left out of the denominator. How the weights work.

Tools (196)

NameDescriptionSchema
crm__lists__archiveArchive a list. Membership rows are preserved but the list is hidden from default queries.typed
memory__saveSave (or update) a durable memory: a standing preference, playbook rule, correction, or business fact that should hold across ALL future conversations. Use when the user says "remember…", "always…", "typed
memory__listList every durable memory you hold for this business (business-wide plus the current user's personal ones), with ids and when each was last confirmed. Use before consolidating, when the user asks whattyped
memory__forgetPermanently delete a saved memory. Destructive: confirm with the user first unless they just explicitly asked you to forget exactly this. Users can also remove memories themselves under Settings → Bustyped
business__updateSave what you learn about the business the moment the owner says it: real name, website, industry, who their customers are, what sets them apart, the phone to show on pages, where an ad's click shouldtyped
brand__scan__waitWait for the website scan business.update started (up to 45 seconds) and get what it read: industry, audience, value proposition, claims. Call it right after saving a website on a first draft, then butyped
account__profileReturn the Plyto profile this connection is signed in as: an opaque id that stays the same across token refresh and reconnection, the person's name and email for display, and the business the connectityped
documents__listList the documents the owner has given you, newest first: files attached in the chat (PDF, Word, text), long messages kept as documents, and links you read and kept. Each has an id to read it with doctyped
documents__readRead a document the owner gave you (an attached PDF, Word or text file, a long message kept as a document, or a link you kept), 30,000 characters at a time; pass offset to go on. Read before you answetyped
brand__colors__setSave the brand colors the owner names in chat, as hex codes: the primary (what graphics build on) and, when they give one, an accent. They replace the colors on file (a website scan's guess, a logo's typed
brand__logo__setMake an image the business's logo: the one on file for ads, pages, emails and pitch decks, replacing whatever logo is there (a website scan's find or an older upload). Pass the library asset id of a ltyped
business__claims__removeTake claims off the business profile once the owner says they no longer hold: the business moved and no longer serves the old area, an offer ended, a credential lapsed. Pass each claim as it is on filtyped
crm__contacts__createCreate a contact (or find-and-update if one with the same email already exists in this business). Returns the created/updated contact. Use when the user mentions adding, capturing, or tracking a new ptyped
crm__contacts__updateUpdate fields on an existing contact. Only pass fields you want to change. No-op fields are silently skipped.incomplete
crm__contacts__getFetch a single contact by id, with where they came from: the ad campaign and search keyword that brought them (when an ad did), where they were and on what device, what they asked for on the landing ptyped
crm__contacts__listList contacts in this business with simple filters. For free-text search use crm.contacts.search. For complex filters use crm.contacts.query (W3).typed
crm__contacts__searchFree-text search across contact email, first/last name, and phone. Case-insensitive substring match. Returns up to 20 contacts by default.typed
crm__contacts__get_propertiesReturn all custom property values for a contact as a {key: value} map.typed
crm__companies__createCreate a company (or find-and-update if one with the same domain already exists). Domain is the natural dedup key; always pass the bare domain like 'acme.com' (not the full URL).typed
crm__companies__updateUpdate fields on an existing company. Only pass fields you want to change.incomplete
crm__companies__getFetch a single company by id. Returns null if not found.typed
crm__companies__listList companies in this business. For text search use crm.companies.search.typed
crm__companies__searchFree-text search across company name, domain, and industry. Case-insensitive substring match.typed
crm__companies__get_propertiesReturn all custom property values for a company as a {key: value} map.typed
crm__tags__createCreate a new tag (or find one with the same name; idempotent). Tags are lightweight orthogonal categories like 'VIP', 'Newsletter-only', 'Cold'.typed
crm__tags__listList all tags defined in this business.typed
crm__tags__add_to_contactApply a tag to a contact. Idempotent: adding an already-applied tag is a no-op.typed
crm__tags__remove_from_contactRemove a tag from a contact. Idempotent.typed
crm__tags__list_for_contactList all tags applied to a contact.typed
crm__tags__add_to_companyApply a tag to a company. Idempotent.typed
crm__tags__remove_from_companyRemove a tag from a company. Idempotent.typed
crm__tags__list_for_companyList all tags applied to a company.typed
crm__properties__defineDefine a new custom property on contact or company. Keys must be lowercase snake_case (e.g. 'plan_tier'). For single_select / multi_select, options is required.typed
crm__properties__listList custom property definitions for an entity type. Excludes archived by default.typed
crm__properties__archiveArchive a custom property. Existing values are preserved but the property is hidden from UI and rejected for new value sets. To 'rename', archive + redefine.typed
crm__properties__set_contact_valueSet the value of a custom property on a contact. Value type must match property type. For multi_select pass an array of option values.incomplete
crm__properties__set_company_valueSet the value of a custom property on a company.incomplete
crm__properties__set_deal_valueSet the value of a custom property on a deal.incomplete
crm__properties__clear_contact_valueRemove a custom property value from a contact.typed
crm__properties__clear_company_valueRemove a custom property value from a company.typed
crm__properties__clear_deal_valueRemove a custom property value from a deal.typed
crm__properties__get_deal_valuesReturn all custom property values for a deal as a {key: value} map.typed
crm__pipelines__listList all pipelines in this business (excludes archived by default).typed
crm__pipelines__list_stagesList the ordered stages in a pipeline. Use to look up stageIds for crm.deals.move_stage.typed
crm__pipelines__get_defaultGet the default pipeline for this business (the one new deals land in by default). Returns null if no default is set.typed
crm__deals__createCreate a deal in a pipeline. If pipelineId/stageId omitted, lands in the business's default pipeline at the first open stage. Attach to a contact and/or company for full context. valueCents is the deatyped
ads__campaign__updateEdit an existing ad campaign: name, objective, daily budget, plain-English audience, Google search keywords, or a listing campaign's property facts (listing: the price, beds, baths, size, address or otyped
crm__deals__updateUpdate fields on a deal. Use crm.deals.move_stage to change stage (it handles close events). Use crm.deals.close_won / close_lost for the won/lost transitions.incomplete
crm__deals__move_stageMove a deal to a different stage in the same pipeline. If the target stage is a won/lost stage, this auto-sets closedAt and emits the appropriate close event.typed
crm__deals__close_wonClose a deal as won: moves it to the won stage in its pipeline. Sets closedAt and emits deal.won.typed
crm__deals__close_lostClose a deal as lost: moves it to the lost stage in its pipeline. Records lostReason and emits deal.lost.typed
crm__deals__getFetch a single deal by id.typed
crm__deals__listList deals with simple filters. Filter by pipeline/stage for Kanban view, or by contact/company for deal history. `open: true` returns only open-stage deals; omit for all.typed
crm__deals__searchFree-text search across deal names.typed
crm__activities__logLog an activity: something that happened (past or scheduled). Distinguished from tasks (future intent) and notes (no structure). Use 'log a 30-min discovery call with Jane' style prompts. happenedAt dtyped
crm__activities__listList activities, optionally filtered by entity (contact/company/deal) or owner. Returned in reverse chronological order by happenedAt.typed
crm__activities__getFetch a single activity by id.typed
crm__tasks__createCreate a task: future intent ('follow up with Acme by Friday'). Distinguished from activities (past event) and notes (no structure). Auto-assigns to the calling user if assignedToUserId omitted.typed
crm__tasks__completeMark a task as completed. Sets completedAt to now.typed
crm__tasks__cancelMark a task as cancelled (rejected, different from completed). Use when the user decides a task is no longer relevant.typed
crm__tasks__listList tasks. Open tasks sort by due date (closest first). Completed tasks sort by completion (most recent first).typed
crm__tasks__getFetch a single task by id.typed
reports__previewRun a report config WITHOUT saving. Use it to answer analytical questions ('deals by stage', 'contacts added per month', 'email opens last 30 days') and to sanity-check a config before reports.create.typed
crm__sources__performanceMarketing-source attribution: for every source (ad campaigns, UTM-tagged traffic, forms, inbound webhook, manual, import…; the webhook also accepts POST {email, outcome: qualified|customer} at /outcomtyped
reports__createSave a custom report as a live card on the user's Reports dashboard. Use when the user asks for a report or says yes to saving an analysis. The config is re-executed on every dashboard view (always lityped
reports__listList the saved custom reports on the Reports dashboard.typed
crm__notes__addAdd a freeform note attached to a contact, company, deal, or any combination. Use for 'remember that Jane prefers email over phone' style facts.typed
crm__notes__listList notes, optionally filtered by attached entity.typed
crm__lists__createCreate a contact list. Manual lists are curated by hand; dynamic lists have a filter DSL (DNF: {or:[{and:[conditions]}]}) that defines membership. For dynamic, pass `criteria`. For manual, omit it.typed
crm__lists__getFetch a single list by id.typed
crm__lists__listList all contact lists in this business.typed
crm__lists__membersReturn the contacts that are members of a list. For manual lists this returns explicit memberships; for dynamic lists it evaluates the criteria filter against contacts (lazy recompute).typed
crm__lists__add_contactAdd a contact to a MANUAL list. Idempotent.typed
crm__lists__remove_contactRemove a contact from a manual list.typed
forms__createCreate a form. Slug becomes the URL: /forms/<slug>. Fields are JSON-defined with type matching the contact property type system (text/email/url/number/date/checkbox/select/multi_select/textarea/phone)typed
forms__updateUpdate a form: rename it, replace its fields, change appearance (theme), button text, thank-you behavior, or the capture list. Omitted properties keep their current value; `fields` and `theme` replaceincomplete
forms__getFetch a form by id.typed
forms__listList all forms in this business.typed
forms__list_submissionsList submissions for a form, newest first.typed
forms__get_embed_codeGenerate the JS embed snippet and iframe alternative for a form. Returns both; the user picks whichever fits their site.typed
crm__contacts__queryQuery contacts with a structured filter DSL. Use this for complex 'show me contacts where X and Y but not Z' queries. Simpler cases prefer crm.contacts.search (free text) or crm.contacts.list (single typed
agency__clients__listThe client workspaces this agency workspace runs (each client is its own workspace under the agency's brand), with white-label state, who gets the reports and when the last one went out. On a client wtyped
agency__client_report__previewWhat this workspace's client report would say for the last 7 or 30 days: ad spend, leads, cost per lead, revenue won, by campaign, and the recent leads. Read-only; agency.client_report.send sends it.incomplete
ads__campaign__draftCreate a draft ad campaign on Meta (Facebook and Instagram), Google, or ChatGPT (OpenAI's ChatGPT Ads), the platforms Plyto can actually launch and manage. Drafts are NOT live: they require user approtyped
ads__listing__readRead a property listing page (Zillow, Realtor.com, Redfin, an MLS or brokerage page): the address, beds, baths, size, price, photos (imported to the library as the ad pictures), the agent and brokeragtyped
ads__campaign__listList ad campaigns for the active business, optionally filtered by status and/or platform. Use when the user asks to see their campaigns or get an overview. The status of a launched campaign here is whtyped
ads__performance__summaryTHE authoritative source for a campaign's spend, impressions, clicks and conversions: use this for any question about how much a campaign has spent or how it is performing. Defaults to last 7 days. Nutyped
ads__performance__analyzeAnalyze recent performance for the active business: surface ads/ad sets that aren't getting impressions, ones spending without converting, and concentration patterns where a small slice drives most retyped
ads__creative__draftCreate a draft ad creative attached to an existing ad set. Combines an uploaded image with copy + CTA + landing URL. The creative goes live with the ad set when the campaign is launched. Use after adstyped
ads__creative__generate_imagesGenerate AI ad photographs from a prompt + the business's brand profile, sized for Meta placements, and save them to the creative library. For a physical business the picture is the work or the productyped
ads__creative__compose_graphicCompose a DESIGNED ad graphic deterministically: real type, the real logo, the real product image, proof from the claims on file. No AI image model; the only AI step is one quick look at the product ityped
ads__assets__listList the creative library (images, videos) for the active business, with what each asset IS: role 'site-capture' is the real picture of their website the scan saved (the hero for ads.creative.compose_typed
ads__creative__flyerMake a flyer, poster or handout the owner can download and print, post or send: their title, the facts (when, where, what is included), how to reach them, their logo and one real photo, in their brandtyped
ads__creative__compose_from_photoTurn a REAL photo from the library into a finished ad set: the photo cropped for every placement size, the headline in real type, the real logo. No image model, no credits, nothing invented. THE FIRSTtyped
ads__creative__edit_photoEdit one of the owner's REAL photos: take something out of it or change something in it (a coffee table, rugs, clutter, a sign, the background) while their product stays exactly as it is. The edit is typed
ads__creative__generate_videoRender a short video clip (4, 6 or 8 seconds, vertical 9:16 or wide 16:9) for Reels, Stories, TikTok-style and feed placements. Use for ANY request for a video, promo clip, reel or animated ad. It renincomplete
ads__creative__compose_videoTurn library clips and images into a FINISHED video ad: a hook line over the opening seconds, an optional caption per clip, and a closing brand card with the real logo and a button, at 9:16 for Reels,typed
ads__ads__listList every ad on a campaign with its ID, grouped by ad group. Run this BEFORE ads.creative.update or ads.creative.delete: those tools take the ad's id, never its headline text. Also the honest way to typed
ads__assets__deletePermanently delete an UNUSED image or video from the creative library (the file and its record). Refused when the asset — or any of its placement-size siblings (same name, different ratio) — is attachtyped
ads__campaign__locations__getWhere a campaign's ads show: the location targeting as the ad platform itself reports it for a live or paused campaign (Google: the places plus whether only people physically there see the ads; Meta: typed
ads__campaign__changesThe change history of a campaign: every edit made through Plyto (budget, locations, keywords, bidding, status, ads), by whom and when, plus, for a live Google campaign, Google's own change log includityped
ads__campaign__getRead ONE campaign's full setup as it is on Google or Meta right now: bidding strategy and any cap or target, daily budget, what counts as a conversion and whether any have recorded in 30 days, the loctyped
ads__landing_pages__buildBuild a landing page for every ad group in a campaign (or one ad group): a Plyto-hosted page whose headline says the ad's promise back in the visitor's words, brand-grounded bullets, proof only from ttyped
ads__landing_pages__listThe landing pages Plyto hosts for this business's ads, with their links, which campaign and ad group each belongs to, and how many people have viewed each. Use before building pages (to reuse), and whtyped
ads__landing_pages__getEverything on one landing page, for reading back or editing: every line of copy, the photo, the accent color, whether it collects details (form) or sends people to a link, which ad it belongs to and wtyped
ads__landing_pages__updateEdit one landing page: pass ONLY what changes and everything else stays. 'Change the headline to X' is headline alone; 'I don't like the color' is accent alone; 'send people to my booking link' is destyped
ads__landing_pages__createMake ANOTHER landing page for an ad group: a second angle to test against the page ads.landing_pages.build made, a page for a new offer, a variant the owner asked for. You give the ANGLE; Plyto's copytyped
ads__delivery__diagnoseExplain why live campaigns are or aren't delivering: learning phase, budget too small to enter the auction, rejected ads, audience too narrow, payment problems. Use whenever the user asks why a campaityped
ads__campaign__launchLaunch a DRAFT campaign on Facebook and Instagram or Google Ads, the same way the Run it button does: checks that the ad account, payment method, Page and lead capture are in place, then starts the latyped
ads__campaign__status__setPause a live campaign or resume a paused one on the ad platform, the same path as the page's pause and resume buttons (platform call, audit row, undoable). Pausing needs no confirmation and stops spentyped
ads__campaign__refreshPull the current state of launched campaigns, their ad groups and their ads straight from Google Ads and Facebook, and match Plyto's records to it: live or paused at every level, the campaign's daily typed
ads__destination__getWhere this business's ad clicks go, or, when nobody has decided yet, the short numbered question to ask the owner (ask: one line per choice, their site's real pages checked live, and the pick with itstyped
ads__destination__setRecord where the owner wants ad clicks to go, then do what that implies: build and host the landing page (page, or an embeddable link), point the campaign's draft ads at their site or link (site, linktyped
ads__funnel__summaryThe funnel behind the ad spend, by campaign, for the last N days: spend, clicks, and every stage after the click through to a paying customer, with cost per stage. Call this BEFORE judging a campaign,typed
ads__google_audience__listList the Customer Match and remarketing audiences on the connected Google Ads account, with their sizes. Use when the user asks what Google audiences they have or before targeting one.typed
ads__campaign__locations__setSet or replace the location targeting on a campaign, DRAFT or LIVE: plain place names, applied to every ad group, plus (Google) whether the ads reach only people physically in those places. Use when tincomplete
ads__creative__addAdd one ad (headline + primary text + CTA, plus a link except on a Meta leads campaign with an instant form, where the form is the destination) to a campaign's ad set. On a DRAFT it is saved and launctyped
ads__meta__ads__publishPut finished draft ads (copy and picture) onto Meta inside a campaign that is already launched, live or paused, in the ad set they were added to. Use after ads.creative.add (with confirmLiveEdit) and typed
ads__meta__ad_sets__publishCreate ad sets that exist only in Plyto on Meta, inside a campaign that is already launched (live or paused), PAUSED, with their finished draft ads (copy and picture) inside. Use after new audiences wtyped
ads__meta__ads__refreshPush what an ad carries NOW (its picture set, copy, button and landing page) to the ad already on Meta, as a new creative on the same ad. Use after ads.creative.compose, ads.creative.update or a landityped
ads__ad_set__statusTurn one ad set of a launched Meta campaign on (live) or off (paused) while the campaign keeps running. Use for 'turn on the plumbing ad set', 'pause the dental audience'. Two steps: call without conftyped
ads__ad_set__spend_floorSet the least a Meta campaign's shared daily budget spends on one ad set each day (a minimum spend target), so a small audience is not starved by the others in a test. Only for campaigns with a campaityped
ads__meta__goal__setSwitch what a Meta campaign aims for: landing_page_views (people who reach the page; right for an account whose pixel has no conversions yet, or when the owner asks for visits first) or conversions (ttyped
ads__meta__pixel__setupSet up the Meta pixel on the business's connected Facebook ad account: keeps the one already chosen, adopts the account's only pixel, or creates one named after the business when the account has none typed
ads__creative__attach_imageAttach a creative-library image OR video clip to a draft ad (sets it as the ad's media; for image sets, launch resolves the other placement sizes by the asset's name-siblings; a video clip launches astyped
ads__creative__detach_imageTake the picture off a DRAFT ad. The file stays in the library (ads.assets.delete removes it); the ad keeps its words and is marked as waiting for a picture, so it will not launch bare. Use it when a typed
ads__google_audience__createTEMPORARILY UNAVAILABLE: Google approved Plyto for conversion reporting, and approval for customer list uploads is still pending, so this tool currently refuses with an explanation. When a user asks ftyped
ads__lead_form__listList the Facebook instant forms (lead forms) on the connected page, with how many leads each has collected. Use when the user asks about their lead forms or before pointing a campaign at one.typed
ads__pictures__holdPut a campaign's pictures on hold because the owner said to wait for their own photo ("don't make any imagery until I send the exterior shot", "no pictures yet, I'll send some"). While it holds, nothityped
ads__pictures__releaseLift the picture hold on a campaign because the owner said in so many words to go ahead without their photo (or to make a placeholder after all). The ads then take pictures again the usual way. Not netyped
ads__audience__listList the Meta custom audiences and lookalikes on the connected ad account, with their approximate sizes. Use when the user asks what audiences they have, or before targeting or building one.typed
ads__audience__createCreate a Meta audience for the business: either a custom audience from one of their Plyto contact lists, or a lookalike of an audience they already have. Use when the user wants to target their customtyped
ads__audience__interestsSearch Meta's interest and behavior catalog for detailed targeting, with approximate audience sizes. Use when the user wants to target people by interest, or asks what interests they could target. Rettyped
ads__search_terms__listShow what people actually searched for before seeing the business's Google ads, with spend, clicks and conversions per term, and which terms are wasting money (spend with zero conversions). Use when aincomplete
ads__negative_keywords__addBlock search terms on a Google campaign by adding them as negative keywords, so the ads stop showing for that traffic. Use after finding wasteful terms. This lowers wasted spend and never raises a budtyped
ads__negative_keywords__listList the negative keywords already blocking traffic on a Google campaign. Use before adding more, so nothing is added twice.typed
websites__create_siteCreate a WEBSITE: the business's home on the web, multi-section, with a nav. NOT for landing pages: the page an ad sends people to is ads.landing_pages.build, under Marketing, Landing pages. HOW TO BUtyped
ads__lead_form__createCreate a real instant form on the business's Facebook page. It becomes a live asset on their page that collects strangers' names, emails and phone numbers, and Facebook does not let you delete forms ttyped
ads__google__conversion_tracking__repairSet up Google conversion tracking for a business that is missing it. Use when a campaign launched without conversion tracking, or when the campaign page reports that setup failed. It never changes howtyped
ads__destinations__syncPush the landing page URLs shown in Plyto to the live ads on Google, for a campaign whose destinations were changed after launch. Use when ads are sending traffic somewhere other than what the campaigtyped
ads__google__search_partners__setTurn Google Search Partners on or off for a live campaign. Partner sites deliver cheap clicks with high click-through rates and far worse conversion than Google Search, so turning them off is the stantyped
ads__google__bidding__setSwitch a live Google campaign between clicks bidding and conversions bidding. Use maximize_clicks when a campaign shows zero or near-zero impressions on Google Search because it is optimizing toward ctyped
ads__google__ads__strengthenFill every live responsive search ad in a Google campaign up to the full 15-headline / 4-description asset counts, keeping all existing lines and pins and adding brand and ad-group-themed lines. Use wtyped
ads__creative__updateEdit an existing ad's headline, description, button or destination link. Drafts update in place. A live Google search ad gets a replacement version published and the old one paused, because Google doetyped
websites__list_sitesList this business's websites with status and URLs.typed
ads__creative__deleteDelete a DRAFT ad outright (its images stay in the library), or PAUSE a live Google search ad (published ads can't be deleted, but a paused ad stops serving immediately). Use when a pre-launch check ftyped
ads__funnel__testSend a tagged test lead through a campaign's whole funnel: landing page, form, CRM contact, conversion attribution, and a dry-run Google upload check. The test lead uses an undeliverable address, is rtyped
ads__google__keywords__addAdd keywords to a live Google campaign's ad group, phrase match by default. Use to feed phrasing families that are converting, for example when winning search terms are not yet covered by the keyword typed
ads__google__ads__add_landing_variantStart a landing page A/B test on the live Google campaign. In ad groups with room it adds a copy of the strongest ad pointing at the new URL; in groups already at Google's 3-ad cap it repoints the weatyped
ads__query_pages__buildThe query-to-page engine: cluster what people actually searched on a live Google campaign, generate one landing page per intent cluster (headline that speaks the search back, brand-grounded copy, the typed
ads__google__ad_groups__addAdd a complete search ad group (keywords phrase-match by default, RSA copy) to a SPECIFIC Google campaign by id. Headlines are at most 30 characters and descriptions 90, and every offer, timeframe or typed
ads__google__ad_groups__removeRemove an ad group you (or the user) no longer want. Draft groups are deleted outright along with their draft ads. Groups on a LIVE campaign are PAUSED in Google instead: delivery stops immediately, htyped
ads__campaign__deleteDelete a campaign that never launched (draft or failed): the campaign, its ad groups, and its draft ads are removed permanently; images stay in the creative library. A campaign that has reached the adtyped
websites__get_siteGet a site with its theme and every section (block ids, kinds, content) for editing. Call it before any edit so you change the right block, and read the current content back to the person in plain wortyped
ads__google__extensions__generateDraft sitelinks, callouts, and a structured snippet for a DRAFT Google campaign from the brand profile and the campaign's own keywords, and save them onto the draft. They are applied to Google at launtyped
email__create_templateCreate a reusable email template. Body and subject are plain text and support merge tags: {{contact.firstName}}, {{contact.lastName}}, {{contact.fullName}}, {{contact.email}}, {{business.name}}, with typed
email__list_templatesList email templates for this business.typed
email__list_sendsList recent email sends, optionally filtered to one contact or template. Shows delivery status per send.typed
email__get_send_statsAggregate send counts by status (queued/sent/delivered/opened/clicked/bounced/failed), optionally for one template and/or a recent window. Use to answer 'how did that email do?'typed
email__domain__statusCheck the business's custom sending domain: current status, and when it is still pending, exactly which DNS records have not been found yet (record type, host name, and value to add). Calling this alstyped
email__signature__setSet or clear the CURRENT USER's personal email signature for this business (their Gmail-style sign-off, appended when they compose one-to-one emails from a contact page). ONE-TO-ONE ONLY: marketing catyped
email__campaign__listList email marketing campaigns with status, type, subject, and audience size. Use to answer 'what campaigns do we have' or find a campaign to edit.typed
email__campaign__getGet one email campaign's full draft: subject, preview text, body, audience, schedule, A/B test setup and (once it has sent) its per-variant results and winner, plus the current eligible-recipient breatyped
email__campaign__createCreate a DRAFT email marketing campaign (never sends anything). Write subject/preview/body in the brand voice; the user reviews in the composer and nothing goes out without an explicit send confirmatityped
seo__list_auditsList recent SEO/GEO audits with scores.typed
email__campaign__updateEdit a draft or scheduled email campaign: name, subject, preview text, body, audience list, schedule, or A/B test. Plyto DOES support A/B testing on email campaigns: set abVariable plus the matching Btyped
automations__createCreate an automation: a trigger + a linear chain of steps. Created in DRAFT and it stays that way. Do NOT activate it as part of building it: tell the user what it does and let them ask for it to be ttyped
automations__pausePause an active automation: no new enrollments. In-flight enrollments finish their current step and then hold (W7 executor checks status).typed
automations__listList automations with status and trigger.typed
automations__getFetch one automation with its full step graph (ordered), for inspection or before editing.typed
automations__connect_stepsRewire the step graph: point a step's `next` or `branch_false` slot at another step (or null to make that path exit). Use after automations.get to see current wiring.typed
automations__list_enrollmentsList enrollments (who's in an automation and where they are), filterable by automation and state.typed
automations__get_step_runsStep-by-step execution log for one enrollment: what ran, when, with what outcome/error. The debugging tool for 'why didn't Jane get the email?'typed
automations__exit_contactForce-exit an active enrollment: the contact stops at the next step boundary and receives nothing further from this automation. Use when someone asks to be left alone or was enrolled by mistake.typed
automations__retry_enrollmentSend a FAILED enrollment back to the step that failed, so the contact continues from there (nothing they already received is sent again). Use after the cause is fixed. automations.list_enrollments wittyped
automations__test_runStatic dry-run: validates every step of an automation WITHOUT executing anything: action tools exist and accept their arguments (with templates resolved against dummy values), delays/waits are in bountyped
automations__restoreRestore an archived automation. It comes back PAUSED (never auto-active). Activate it separately to resume enrolling. Previously-exited contacts are not re-enrolled.typed
websites__update_siteChange a site's settings: name, SEO title and description, accent color, font pairing, corner radius, dark or light. Omitted settings keep their value, so 'make it darker' is dark: true and nothing elincomplete
websites__update_blockEdit part of a section. Pass ONLY the fields that change; everything else in the section is kept, so 'shorten the headline' touches the headline and nothing else. Arrays (items, steps, images) are reptyped
websites__add_blockAdd a section to a site, at the end or at a position (0 is the top; later sections shift down). Same shapes and photo rules as websites.create_site. 'Add pricing' means: ask nothing if the prices are typed
websites__remove_blockRemove a section from a site. Do it the moment they ask ('take off the pricing', 'remove the gallery'): photos stay in the library, the section can be added back, and nothing is public until they publtyped
websites__reorder_blocksReorder a site's sections ('move pricing above the FAQ'). Pass the COMPLETE list of block ids in the new top-to-bottom order (websites.get_site returns them). Partial lists are rejected so blocks can'typed
websites__photosWhat this business can put on a website, newest first: real photos the owner added or attached in chat (what: photo), product screenshots (product-screen), and scenes Plyto generated for ads (generatetyped
websites__analyze_websiteFetch and analyze an existing website (theirs or a competitor's). Returns title, description, headings, navigation links, and the page's visible text so YOU can rebuild it as a much better Plyto site.typed
websites__check_custom_domainVerify a site's custom domain DNS. If the records point at us, the domain goes active and the site serves on it (TLS is automatic).typed
seo__run_auditRun an SEO + GEO (generative engine optimization) audit on a URL. Fetches the page, robots.txt, sitemap.xml and llms.txt, runs ~15 deterministic checks (title, meta description, headings, alt text, sttyped
seo__blog__create_draftSave a blog post draft. YOU write the post (600-1200 words of genuinely useful, non-generic content in the brand voice, markdown with ## headings) and pass it here. Include a meta description (<=155 ctyped
seo__blog__listList blog posts (drafts and published).typed
seo__blog__update_settingsConfigure the automatic blog writer: posts per week (0 disables, max 3), topic list to rotate through, and whether posts auto-publish or wait as drafts. HARD CEILING: 3 posts per week and 10 per day, typed
booking__pages__listList the business's booking pages with their public URLs, durations, and weekly availability. A booking page is where a lead picks a call time; a booked call automatically qualifies the lead (sales_qutyped
booking__pages__createCreate a booking page and return its public URL, ready to share, link from the website, or put in a form's thank-you message. Availability is weekly windows in 24h HH:MM, keyed by weekday number (0=Sutyped
booking__bookings__listUpcoming booked calls: who, when, their note, and the show-up task. Use for questions like "what calls do I have" or "who booked this week".typed
pitches__createGenerate a branded pitch deck: a full slide presentation built from the brand kit (colors, logo, voice, approved claims) and, when a deal/company/contact id is given, grounded in that CRM record — whotyped
pitches__listList this business's pitch decks with status, share links, and view counts. The honest source for 'has anyone opened the deck'. Status 'generating' means the deck is still building; 'failed' means thetyped
pitches__edit_slideEdit one slide of an existing pitch deck with an AI rewrite that keeps the deck's design. The share link updates instantly. Use when the user wants to tweak a deck: change wording, adjust a slide's antyped
pitches__deleteDelete a pitch deck permanently. Its share link stops working immediately. Two-step: first call returns the deck title to confirm with the user; call again with confirm:true to delete (the same two-sttyped

Badge

Paste into your README. It updates on every verification.

[![AgentXM](https://app.agent-xm.com/badge/ai-plyto-crm.svg)](https://app.agent-xm.com/a/ai-plyto-crm)

Was this agent useful?

Claim this listing

The token was returned when the agent was registered. No token? Prove the domain or repository instead.