Servidor MCP

Cromanion

com.cromanion/cromanion
Datos y analítica Marketing y publicidad Público y accesible MCP 2026-07-28

Qué hace este MCP

Manages website conversion experiments, visitor holdouts, conversion goals, agent-generated site messaging, lead destinations, and impact measurement.

cromanion_add_goal
Define a conversion to count, or change one you already defined. This is not one more setting: it is the numerator of every impact figure your human will read, so a goal that fires on every pageview makes the agent look brilliant and tells them nothing. Send `type` and `value` to create — idempotent, the same matcher twice creates one goal. Send `goalId` instead to rename, reprioritise or price an existing one, or with `remove: true` to stop counting it. Needs the goals permission.
Idempotente
Esquema de entrada
{'type': 'object', 'required': [], 'properties': {'type': {'type': 'string', 'description': 'Matcher: css_click, form_submit, page_view, mailto, tel, outbound, scroll_depth, dwell, custom_event.'}, 'label': {'type': 'string', 'description': 'What your human will call it. Defaults to something readable.'}, 'value': {'type': 'string', 'description': 'What the matcher matches — a selector, a path, a percentage, seconds.'}, 'goalId': {'type': 'string', 'description': 'Change an EXISTING goal instead of creating one. Ids come from cromanion_config. With `remove: true` it stops counting that conversion; otherwise it applies the label, priority or dollarValue you send.'}, 'remove': {'type': 'boolean', 'description': 'With goalId: stop counting that conversion. Nothing already measured is rewritten.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'priority': {'type': 'number', 'description': 'With goalId: 1 is the primary goal, ascending. Rejected rather than clamped if out of range.'}, 'dollarValue': {'type': 'string', 'description': 'Optional worth of one conversion, for revenue figures.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'goalId'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string', 'description': 'Present when nothing changed, saying why.'}, 'label': {'type': 'string', 'description': 'What your human sees it called, after the change.'}, 'goalId': {'type': 'string'}, 'created': {'type': 'boolean', 'description': 'Present on a create. False when this site already counted that conversion — the call succeeded either way and nothing was duplicated.'}, 'removed': {'type': 'boolean', 'description': 'Present when you sent remove: true.'}, 'updated': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Present on an edit: which fields changed.'}}}
cromanion_add_site
Add another of your human's sites to their account, on a plan that allows more than one. Reaching a site they already own needs no proof — they added it. CREATING one does: nothing about holding a credential for one domain says anything about another, so publish this claim's challenge on the new domain first, the same three ways that proved the first. Refused if your human restricted this credential to specific sites: a list they set should not grow by your action — use cromanion_ask_human. Needs the site-config permission.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['siteUrl'], 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'siteUrl': {'type': 'string', 'description': 'The public https URL of the site to add, e.g. https://second-shop.com.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'site', 'install'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string'}, 'site': {'type': 'object', 'description': 'The new site: its id, domain and mode. Always `learn` to begin with.'}, 'install': {'type': 'object', 'description': 'The snippet for THIS site — a different key from the first one.'}, 'provedBy': {'enum': ['well_known', 'meta_tag', 'dns_txt', 'account_holder'], 'type': 'string'}}}
cromanion_ask_human
Ask your human for something only they can do, in a place they will actually see it. Every other refusal here ends with YOU reading it — a permission they did not grant, a payment you cannot make, a mode you may not set — and from their side you simply went quiet. This puts one request on their notifications screen, attributed to you. Nothing replies here: they act in their console, and you find out by reading cromanion_grants or cromanion_config again. One request an hour, and a second from you replaces the first rather than stacking.
Idempotente
Esquema de entrada
{'type': 'object', 'required': ['title', 'body'], 'properties': {'body': {'type': 'string', 'description': 'Why you need it and what it unblocks, in a sentence or two. Up to 400 characters.'}, 'title': {'type': 'string', 'description': 'What you need, in a line they can read at a glance. Up to 90 characters.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'asked'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string', 'description': 'Where it landed, and that nothing answers back here.'}, 'asked': {'type': 'boolean'}}}
cromanion_claim_domain
Claim another host for this site so its traffic counts, or give one up with `remove: true`. A DIFFERENT registrable domain must be proven on its own — publish this claim's challenge there too, then call again. Subdomains need no call at all: a claimed domain already covers them. Needs the site-config permission.
Destructivo Acceso externo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['domain'], 'properties': {'domain': {'type': 'string', 'description': 'A public hostname, e.g. shop.example.com.'}, 'remove': {'type': 'boolean', 'description': 'Give the host up instead. Needs no proof — it only narrows what we listen to.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'claimed'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string', 'description': 'Present when nothing changed, saying why — usually that a claimed domain already covers this subdomain.'}, 'added': {'type': 'boolean', 'description': 'False when the host was already covered — not a failure.'}, 'claimed': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Every host this site now listens to, after the change. The answer, whichever branch ran.'}, 'removed': {'type': 'string', 'description': 'Present on a removal: the host given up.'}, 'provedBy': {'enum': ['well_known', 'meta_tag', 'dns_txt', 'account_holder'], 'type': 'string', 'description': 'Present when a fresh proof was read, which a different registrable domain requires.'}}}
cromanion_config
Everything IN FORCE on this site: the conversions that count, the facts you may state and the ones forbidden, which surfaces are enabled, the brand, and every distilled rule WITH its status. cromanion_pending shows what is waiting for a decision; this shows what was already decided — including by you. Read it before writing anything, because most writes here REPLACE rather than add.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'goals', 'voice', 'surfaces', 'playbookRules', 'editGenres', 'domains'], 'properties': {'ok': {'type': 'boolean'}, 'hint': {'type': 'string'}, 'brand': {'type': ['object', 'null']}, 'goals': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Conversions that COUNT. `source` says who defined each — `agent` is one of yours.'}, 'voice': {'type': 'object', 'description': "The client's raw text plus the COMPILED buckets: `tone` steers the prompt, `assertions` are facts somebody vouches for, `interdicts` are enforced in code after the model has spoken."}, 'domains': {'type': 'array', 'items': {'type': 'string'}}, 'surfaces': {'type': 'object', 'description': 'Enabled surfaces, the modal switch, stored CSS, and which surfaces carry custom markup.'}, 'editGenres': {'type': 'array', 'items': {'type': 'object'}}, 'youMayDecide': {'type': 'array', 'items': {'type': 'string'}}, 'observedPaths': {'type': 'array', 'items': {'type': 'object'}}, 'playbookRules': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Distilled rules in EVERY state — `proposed`, `approved`, `paused`, `rejected`. This is how you find a rule you paused in order to un-pause it.'}, 'excludedVisitors': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Present only with the measurement permission. ABSENT means you may not see it — not that nobody is excluded.'}}}
cromanion_crawl
Re-read the site, and name the pages that matter most so they are read first. You know this site's structure better than its owner does — seeding it is the cheapest real improvement to what the agent understands. Rate-limited: one crawl per 30 minutes. Needs the site-config permission.
Acceso externo
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'priorityUrls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 10 paths or URLs to read first, e.g. ["/pricing", "/checkout"]. Anything unusable is handed back rather than dropped.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'priorityUrls', 'ignored'], 'properties': {'ok': {'type': 'boolean'}, 'ignored': {'type': 'array', 'items': {'type': 'string'}, 'description': 'What we could not use, handed back rather than dropped — you sent ten and kept eight, these are the two.'}, 'advanceUrl': {'type': 'string', 'description': 'POST this between status polls to advance the crawl yourself, instead of waiting for the cron.'}, 'priorityUrls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The paths we accepted and will read first.'}}}
cromanion_decide
Rule on one thing from cromanion_pending: pass its `kind` and `id` back unchanged with a decision. `approve` / `reject` for everything; `pause` additionally for a playbook rule. Approving a GOAL is different in kind from the rest — it changes what every impact figure for this site means, permanently. You cannot edit rule text here, only rule on it.
Idempotente
Esquema de entrada
{'type': 'object', 'required': ['kind', 'decision'], 'properties': {'id': {'type': 'string', 'description': "The item's id, exactly as cromanion_pending returned it. Ids are not shared across kinds."}, 'all': {'type': 'boolean', 'description': 'Rule on every discovered page at once, ignoring `id`. observed_path only — the other kinds are decided one at a time, as in the console.'}, 'kind': {'enum': ['edit_genre', 'playbook_rule', 'goal', 'observed_path'], 'type': 'string', 'description': 'Which queue the item came from. Copy it back from cromanion_pending unchanged.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'decision': {'enum': ['approve', 'reject', 'pause'], 'type': 'string', 'description': 'A status and nothing else — rule TEXT is edited by cromanion_set_playbook. `pause` applies only to a playbook_rule.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'kind', 'decision'], 'properties': {'id': {'type': 'string'}, 'ok': {'type': 'boolean'}, 'kind': {'enum': ['edit_genre', 'playbook_rule', 'goal', 'observed_path'], 'type': 'string'}, 'ruled': {'type': 'number', 'description': 'Present with `all`: how many were ruled on. Zero is a success — there was nothing waiting.'}, 'summary': {'type': 'string', 'description': 'What the ruling changed, in one line you can repeat to your human.'}, 'decision': {'enum': ['approve', 'reject', 'pause'], 'type': 'string'}}}
cromanion_disconnect_hubspot
Sever the account's HubSpot connection. The other half of cromanion_set_lead_destination's `hubspot` option: you can point leads at a CRM, so you can take them back out. Refused while any site on the account still delivers there — change those destinations first, or the forms would keep working while every lead failed delivery. Reconnecting is NOT a tool: it is an OAuth consent screen only your human can click, so treat this as one-way and say so before you call it. Needs the integrations permission.
Destructivo Acceso externo Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'changed', 'connected'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string'}, 'changed': {'type': 'boolean', 'description': 'False when nothing was connected. That is a success, not a failure.'}, 'portalId': {'type': 'string', 'description': 'The portal that was severed. Present only when something was.'}, 'connected': {'type': 'boolean', 'description': 'Always false on success — the state after the call.'}}}
cromanion_errors
Every refusal this server can return, and what to do about each. Needs no credential — you can read it before you have one, or after a refusal has told you the one you had is gone. The field to branch on is `retry`: `later` means a cooldown or a transient, `fix_request` means change something and resend, `needs_human` means nothing you send will help until a person acts. Read it once and stop guessing whether a 409 is worth retrying.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'errors'], 'properties': {'ok': {'type': 'boolean'}, 'errors': {'type': 'array', 'items': {'type': 'object', 'required': ['error', 'means', 'retry', 'then'], 'properties': {'then': {'type': 'string', 'description': 'What to do. For `needs_human`, what to ask them for.'}, 'error': {'type': 'string', 'description': "The machine token, exactly as it appears in a refusal's `error`."}, 'means': {'type': 'string'}, 'retry': {'enum': ['later', 'fix_request', 'needs_human'], 'type': 'string'}}}, 'description': 'The closed set. A token absent from here is one this server does not emit.'}, 'readMe': {'type': 'string'}}}
cromanion_grants
List what your human has allowed this agent to do, and what they have not. Read this before assuming a capability — the alternative is discovering your permissions by failing in front of them. You cannot change these yourself; only your human can, in their console.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'revoked', 'granted'], 'properties': {'ok': {'type': 'boolean'}, 'granted': {'type': 'array', 'items': {'type': 'object', 'required': ['grant'], 'properties': {'grant': {'type': 'string', 'description': 'The capability token, e.g. `goals`, matching what a refusal names in `neededGrant`.'}, 'label': {'type': 'string', 'description': 'What your human saw when they allowed it.'}}}, 'description': 'Only what you MAY do. A capability absent from this list is one to stop planning around.'}, 'revoked': {'type': 'boolean', 'description': 'True once your human has ended this credential. Nothing else will work; do not retry.'}}}
cromanion_impact
What the agent has actually changed: visitors who saw it versus the 10% held back as a control. Read `liftStatus` before reporting anything — `learn` means nothing has been shown yet and `insufficient` means the arms are too small to tell signal from noise. Neither is 'no lift'.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'impact'], 'properties': {'ok': {'type': 'boolean'}, 'impact': {'type': 'object', 'description': 'Exposed arm versus the held-back control. Read `liftStatus` FIRST — it decides whether the numbers beside it mean anything yet.'}, 'readMe': {'type': 'string', 'description': "What each liftStatus means. `learn` = nothing shown yet, `insufficient` = arms too small to separate from noise. Neither is 'no lift'."}}}
cromanion_install_check
Why the tag is not firing. cromanion_site_status tells you `verified: false`; this tells you WHY — fetching your human's own pages and reporting, per page, whether the tag is there and what is stopping it. It finds the four failures a boolean cannot: the tag missing from some pages but not others, a Content-Security-Policy blocking the script, a consent manager holding it, and beacons arriving from a host the site was not claimed under. Each comes back with the fix. Rate-limited to one check every two minutes, because it fetches ten pages from your human's server.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'problems', 'pages', 'checked', 'present'], 'properties': {'ok': {'type': 'boolean'}, 'pages': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Per page: the status we got, whether the tag was in the HTML, and whether a consent manager had parked it.'}, 'checked': {'type': 'number'}, 'present': {'type': 'number', 'description': 'How many of the fetched pages carry the tag.'}, 'verdict': {'type': 'string', 'description': 'No problems is not the same sentence as it working: a beacon still needs a real visitor.'}, 'problems': {'type': 'array', 'items': {'type': 'object', 'required': ['problem', 'detail', 'fix'], 'properties': {'fix': {'type': 'string', 'description': 'What to change, in words you can act on or repeat to your human.'}, 'detail': {'type': 'string'}, 'problem': {'enum': ['not_installed', 'some_pages_missing', 'blocked_by_csp', 'held_by_consent', 'host_mismatch', 'pages_unreachable'], 'type': 'string'}}}, 'description': 'Empty means the tag is present and nothing blocks it. Each entry carries what is wrong and what to do.'}}}
cromanion_mark_read
Mark notifications read once you have passed them on to your human. cromanion_pending returns the unread ones and nothing cleared them, so the queue grew for ever and you re-read the same items on every poll. Send a notificationId for one, or nothing to clear them all. Needs the decisions permission.
Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'notificationId': {'type': 'string', 'description': 'One notification, by the id cromanion_pending returned. Omit to mark every unread one read.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'marked'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string'}, 'title': {'type': 'string', 'description': 'Present when you named one.'}, 'marked': {'type': 'number', 'description': 'How many were actually unread. Zero is a success, not a failure.'}}}
cromanion_open_claim
Start here, and you need nothing to do it — no API key, no human. This call takes no credential and creates NOTHING: no account, no key, no charge. It returns a challenge to publish on the site you manage (a file, a meta tag or a DNS record — whichever your hosting lets you write) and the secret you will authenticate with once the proof is read. That proof is the whole trust model: we cannot take your word for an email address, but we can check what you control. Store the secret; it is shown once. Refuses if the address already has an account, because controlling a site does not prove controlling a mailbox.
Esquema de entrada
{'type': 'object', 'required': ['email', 'siteUrl'], 'properties': {'agent': {'type': 'string', 'description': 'Optional: what you call yourself, for support and audit.'}, 'email': {'type': 'string', 'description': "Your human's email. It becomes the account's login."}, 'siteUrl': {'type': 'string', 'description': 'The public URL of the site to optimize, e.g. https://example.com.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'claimId', 'secret', 'challenge', 'domain', 'expiresAt', 'proofs'], 'properties': {'ok': {'type': 'boolean'}, 'domain': {'type': 'string', 'description': 'The domain we resolved from your siteUrl, and the one the proof must appear on.'}, 'proofs': {'type': 'object', 'description': 'The three ways to prove control, each with the exact URL and the exact string. Publish any ONE, then call cromanion_verify_claim.'}, 'secret': {'type': 'string', 'description': 'Shown ONCE. Store it now — we keep only its hash, so a lost secret means a new claim.'}, 'claimId': {'type': 'string', 'description': "This claim's id, for your own logs."}, 'challenge': {'type': 'string', 'description': 'The random string to publish. It proves this claim and no other.'}, 'expiresAt': {'type': 'string', 'description': 'ISO timestamp. Redeemable until then; after that, open another.'}, 'verifyUrl': {'type': 'string', 'description': 'The HTTP equivalent of cromanion_verify_claim, if you would rather curl it.'}}}
cromanion_pending
Everything on this site that is waiting for a decision: page rewrites the agent wants to make, rules it distilled from real sessions, conversions it spotted but has never counted, and pages your traffic found that the crawl missed. This is the client's actual job in the console, in one call. Rule on an item with cromanion_decide.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'items', 'notifications', 'youMayDecide'], 'properties': {'ok': {'type': 'boolean'}, 'hint': {'type': 'string'}, 'items': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'id', 'title', 'decisions'], 'properties': {'id': {'type': 'string', 'description': 'Unique within its kind, not across kinds.'}, 'kind': {'enum': ['edit_genre', 'playbook_rule', 'goal', 'observed_path'], 'type': 'string'}, 'title': {'type': 'string', 'description': 'Already resolved — never an id you have to look up.'}, 'detail': {'type': 'string', 'description': "What you are being asked to allow, in your human's terms."}, 'evidence': {'type': 'object', 'description': 'Occurrences, sessions, confidence — when there are any.'}, 'decisions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The verbs THIS item accepts, so you never guess one.'}}}, 'description': "Everything waiting. Pass an item's kind and id back to cromanion_decide unchanged."}, 'youMayDecide': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Your own grants, echoed here so you do not rule on an item you will be refused for.'}, 'notifications': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Unread notes for your human. Not decisions — the other reason they would open the console.'}}}
cromanion_set_brand
Adjust the palette, fonts and button styling the agent paints its surfaces with. The crawl guesses these from a stylesheet; you probably know the real tokens. Cosmetic only — it changes how the agent looks, never what it may say. Needs the brand permission.
Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'colors': {'type': 'object', 'description': 'Hex per role, e.g. {"primary":"#1a1a2e"}. Roles come from cromanion_site_status.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'ctaFill': {'type': 'string', 'description': 'Primary button background, hex.'}, 'ctaText': {'type': 'string', 'description': 'Primary button text colour, hex.'}, 'bodyFont': {'type': 'string', 'description': 'CSS font-family stack for body text, e.g. "Inter, sans-serif".'}, 'ctaRadius': {'type': 'string', 'description': 'Primary button corner radius, e.g. 8px.'}, 'headingFont': {'type': 'string', 'description': 'CSS font-family stack for headings, e.g. "Inter, sans-serif".'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'palette'], 'properties': {'ok': {'type': 'boolean'}, 'button': {'type': 'object'}, 'palette': {'type': 'object', 'description': 'The stored colours, by role.'}, 'version': {'type': ['string', 'number'], 'description': 'Bumped on every save, so the edge picks the new tokens up.'}, 'typography': {'type': 'object'}}}
cromanion_set_exclusions
Put an excluded device back into the measurement. Your human can mark their own devices as "not a real visitor" so their browsing does not count; this removes one of those marks, by the label they gave it. You cannot ADD an exclusion — that names the caller's own browser, which you do not have. Needs the measurement permission.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['label'], 'properties': {'label': {'type': 'string', 'description': 'The label your human gave the device, as cromanion_config lists it. An ambiguous label is refused rather than guessed at.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'removed'], 'properties': {'ok': {'type': 'boolean'}, 'removed': {'type': 'string', 'description': 'The label that is no longer excluded.'}, 'stillExcluded': {'type': 'number'}}}
cromanion_set_holdout
Set the share of visitors held back from the agent so its effect stays measurable (0.05–0.5). Changing it splits the measurement window: periods either side are compared separately and never pooled. Needs the measurement permission.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['share'], 'properties': {'share': {'type': 'number', 'description': 'Fraction held back, e.g. 0.1 for 10%.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'holdoutShare'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string', 'description': 'That this change split the measurement window, and what that means for later comparisons.'}, 'holdoutShare': {'type': 'number', 'description': 'The share as APPLIED, clamped to 0.05–0.5. Read it rather than assuming your value was taken verbatim.'}}}
cromanion_set_lead_destination
Set where captured leads are delivered: an https webhook, a connected HubSpot portal, or off. Note before you use it: this is the one change that leaves no other trace — forms keep working and visitors keep being thanked while the addresses go somewhere new — so every change emails your human and appears on their notifications screen. Needs the integrations permission.
Destructivo Acceso externo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['kind'], 'properties': {'kind': {'enum': ['webhook', 'hubspot', 'off'], 'type': 'string', 'description': 'Where leads go: `webhook` posts them to your `target` URL, `hubspot` to the connected portal, `off` stops delivery while forms keep working.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'target': {'type': 'string', 'description': 'The https webhook URL. Not needed for hubspot or off.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'changed', 'destination'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string', 'description': 'On a real change: that your human has been emailed and it is on their notifications screen. This is the one setting whose misuse leaves no other trace.'}, 'changed': {'type': 'boolean', 'description': 'False when leads already went there. Nothing was emailed in that case.'}, 'destination': {'type': 'object', 'description': 'Where leads go now.'}}}
cromanion_set_mode
Switch the agent on. `learn` watches and shows visitors nothing; `act` lets it intervene in your human's name. `customizeMode` is a separate axis for rewriting their own page copy: `off`, `shadow` (propose only) or `live`. Needs the activation permission.
Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'mode': {'enum': ['learn', 'act'], 'type': 'string', 'description': "`learn` watches and shows visitors nothing; `act` lets the agent intervene in your human's name. Omit to leave it as it is."}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'customizeMode': {'enum': ['off', 'shadow', 'live'], 'type': 'string', 'description': "Rewriting your human's own page copy, a separate axis from `mode`: `off`, `shadow` (propose only, nothing shown) or `live`. Omit to leave it as it is."}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'changed', 'mode'], 'properties': {'ok': {'type': 'boolean'}, 'mode': {'enum': ['learn', 'act'], 'type': 'string', 'description': 'The mode as it now stands.'}, 'changed': {'type': 'boolean', 'description': 'False when it already was what you asked for. Not a failure.'}, 'customizeMode': {'enum': ['off', 'shadow', 'live'], 'type': 'string'}}}
cromanion_set_playbook
Reword a distilled rule, or ask for a fresh distillation. Rules are what the agent learned from real sessions; cromanion_decide approves or pauses them, and this changes what they SAY. Send a ruleId with condition and/or recommendedAction to reword one — ids come from cromanion_config, which also shows rules you have already approved or paused. Send redistill: true instead to distil new rules from recent sessions; they arrive as `proposed` for you to rule on. Rate-limited to one distillation an hour. Needs the decisions permission.
Destructivo
Esquema de entrada
{'type': 'object', 'properties': {'ruleId': {'type': 'string', 'description': 'The rule to reword, from cromanion_config.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'condition': {'type': 'string', 'description': 'When the rule applies, in plain words. Omit to leave it.'}, 'redistill': {'type': 'boolean', 'description': 'Ignore ruleId and distil fresh rules from recent sessions instead.'}, 'recommendedAction': {'type': 'string', 'description': 'What the agent should do when it applies. Omit to leave it.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string'}, 'ruleId': {'type': 'string'}, 'changed': {'type': 'boolean', 'description': 'False when the wording was already what you sent.'}, 'newRules': {'type': 'integer', 'description': 'Proposals that did not exist before this run.'}, 'sessions': {'type': 'integer', 'description': 'Finished sessions the distillation read.'}, 'condition': {'type': 'string'}, 'redistilled': {'type': 'boolean', 'description': 'False when there was nothing to distil (no finished sessions yet).'}, 'recommendedAction': {'type': 'string'}}}
cromanion_set_surfaces
Choose where the agent may speak and what those places look like: which layout surfaces are enabled, whether the exit modal is allowed, custom CSS, and per-surface HTML. Markup and CSS are re-checked against an allowlist on every visitor — anything that could run, or fetch a remote resource, is silently removed, so compare what comes back with what you sent. Needs the surfaces permission.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}, 'enabled': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Surfaces the agent may use: inline_hint, card, sticky_bar, bottom_sheet, inline_block, cta_tooltip.'}, 'customCss': {'type': 'string', 'description': "CSS applied inside the intervention's shadow root. An empty string clears it."}, 'templates': {'type': 'object', 'description': 'Per-surface HTML, keyed by surface. Use {{message}}, {{cta_label}} and {{cta_url}} as placeholders.'}, 'allowModal': {'type': 'boolean', 'description': 'Allow the page-blocking exit modal. Off by default.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'changed'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string'}, 'changed': {'type': 'boolean'}, 'enabled': {'type': ['array', 'null'], 'items': {'type': 'string'}, 'description': 'Surfaces now in use.'}, 'customCss': {'type': ['string', 'null'], 'description': 'The CSS as STORED — compare with what you sent to see what the allowlist removed.'}, 'templates': {'type': 'object', 'description': 'Per-surface, what was kept and what was stripped from your markup.'}, 'allowModal': {'type': 'boolean'}}}
cromanion_set_voice
Write the facts the agent may state to visitors, and the things it must never say. Plain sentences, one idea per line; start a line with 'never' to forbid something. Anything you write that your human's own pages do not already state is attributed to THEM as the source — so write only what they have told you is true. Every rule is checked against your own text and the site's vocabulary, and anything ungrounded is silently dropped: read the returned `lines` to see what actually survived. Your human sees each line attributed to you. Needs the voice permission.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'The whole guidance, replacing what is there. An empty string clears it.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'lines'], 'properties': {'ok': {'type': 'boolean'}, 'lines': {'type': 'array', 'items': {'type': 'object', 'required': ['raw', 'kind'], 'properties': {'raw': {'type': 'string', 'description': 'The sentence, as you wrote it.'}, 'kind': {'type': 'string', 'description': 'Whether it asserts a fact or forbids a phrase.'}, 'backedBy': {'type': 'string', 'description': "What vouches for it — the site's own pages, or your human's assertion through you."}, 'concepts': {'type': 'array', 'items': {'type': 'string'}}}}, 'description': 'What SURVIVED grounding, not what you sent. Compare it with your input; anything missing was dropped as unverifiable.'}, 'cleared': {'type': 'boolean', 'description': 'Present when you sent an empty string: the guidance is now empty.'}}}
cromanion_site_status
Check the site you provisioned: whether the tag is actually live (a beacon received from your own domain, not merely a snippet handed to you), how the crawl is going, and the plan. Poll this after installing the snippet. Requires the claim secret as a bearer token.
Solo lectura
Esquema de entrada
{'type': 'object', 'properties': {'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'site', 'install'], 'properties': {'ok': {'type': 'boolean'}, 'site': {'type': 'object', 'required': ['id', 'domain', 'mode'], 'properties': {'id': {'type': 'string'}, 'mode': {'enum': ['learn', 'act'], 'type': 'string'}, 'domain': {'type': 'string'}, 'createdAt': {'type': 'string'}, 'onboardingStep': {'type': 'string'}}}, 'crawl': {'type': ['object', 'null'], 'description': 'Progress of the site read. While `status` is pending or running it carries `advanceUrl` — POST it between polls to advance the queue yourself.'}, 'account': {'type': ['object', 'null'], 'description': 'Plan and billing state, or null if it cannot be read.'}, 'install': {'type': 'object', 'required': ['publicKey', 'snippet', 'verified'], 'properties': {'docs': {'type': 'string'}, 'snippet': {'type': 'string'}, 'verified': {'type': 'boolean', 'description': "A beacon arrived AND it came from this site's own domain. Both, or false — this is the field to poll."}, 'publicKey': {'type': 'string'}, 'lastBeaconAt': {'type': ['string', 'null']}, 'lastBeaconOrigin': {'type': ['string', 'null'], 'description': 'The host we actually heard from. When verified is false this is usually the whole answer: a staging domain, or a www the site does not serve.'}}}, 'consoleUrl': {'type': 'string', 'description': 'Where your human signs in to see all of this.'}, 'humanNextStep': {'type': ['string', 'null'], 'description': 'What is waiting on your human, in words you can repeat to them. Null when nothing is.'}}}
cromanion_upgrade_link
Get a Stripe Checkout link for a paid plan (pro or growth). Returns a URL and nothing else — YOU do not pay and cannot: give the link to your human, who enters their own card. The site works on the free plan meanwhile. Requires the claim secret as a bearer token.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['plan'], 'properties': {'plan': {'enum': ['pro', 'growth'], 'type': 'string', 'description': 'Which paid plan the link should check out: pro or growth. The site keeps working on free until your human completes it.'}, 'siteId': {'type': 'string', 'description': 'Which site this call is about. Only needed when your credential covers more than one — cromanion_grants lists them and says whether it is required. Omitting it with several is refused rather than guessed at.'}}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'plan', 'checkoutUrl'], 'properties': {'ok': {'type': 'boolean'}, 'plan': {'enum': ['pro', 'growth'], 'type': 'string'}, 'checkoutUrl': {'type': 'string', 'description': 'A Stripe Checkout link. Give it to your human; you cannot complete it.'}, 'instructions': {'type': 'string', 'description': 'What to tell your human, in a sentence you can pass on unchanged.'}}}
cromanion_verify_claim
Redeem a claim once you have published one of its three proofs (a /.well-known file, a <meta> tag, or a DNS TXT record). On success it creates the account and the site and returns the tracking snippet to install. Idempotent — safe to retry. Requires the claim secret as a bearer token.
Acceso externo Idempotente
Esquema de entrada
{'type': 'object', 'properties': {}}
Esquema de salida
{'type': 'object', 'required': ['ok', 'status', 'site', 'install'], 'properties': {'ok': {'type': 'boolean'}, 'site': {'type': 'object', 'required': ['id', 'domain', 'mode'], 'properties': {'id': {'type': 'string'}, 'mode': {'enum': ['learn', 'act'], 'type': 'string', 'description': 'Always `learn` for a new site.'}, 'plan': {'type': 'string', 'description': 'Always `free` for a new account.'}, 'domain': {'type': 'string'}}}, 'status': {'type': 'string', 'description': '`created` the first time, `existing` on a retry — the same account either way.'}, 'install': {'type': 'object', 'required': ['publicKey', 'snippet'], 'properties': {'docs': {'type': 'string'}, 'snippet': {'type': 'string', 'description': 'Paste this before </body> on every page. Do not assemble your own.'}, 'publicKey': {'type': 'string'}}}, 'provedBy': {'enum': ['well_known', 'meta_tag', 'dns_txt', 'account_holder'], 'type': 'string', 'description': 'Which of the three proofs we actually read.'}}}
Modificado
cromanion_set_playbook
27 de September de 2026 a las 02:52
Añadido
cromanion_disconnect_hubspot
17 de September de 2026 a las 12:34
Añadido
cromanion_set_lead_destination
17 de September de 2026 a las 12:34
Añadido
cromanion_set_brand
17 de September de 2026 a las 12:34
Añadido
cromanion_set_exclusions
17 de September de 2026 a las 12:34
Añadido
cromanion_set_holdout
17 de September de 2026 a las 12:34
Añadido
cromanion_set_surfaces
17 de September de 2026 a las 12:34
Añadido
cromanion_set_voice
17 de September de 2026 a las 12:34
Añadido
cromanion_claim_domain
17 de September de 2026 a las 12:34
Añadido
cromanion_add_site
17 de September de 2026 a las 12:34
Añadido
cromanion_crawl
17 de September de 2026 a las 12:34
Añadido
cromanion_add_goal
17 de September de 2026 a las 12:34
Añadido
cromanion_set_mode
17 de September de 2026 a las 12:34
Añadido
cromanion_impact
17 de September de 2026 a las 12:34
Añadido
cromanion_mark_read
17 de September de 2026 a las 12:34
Añadido
cromanion_ask_human
17 de September de 2026 a las 12:34
Añadido
cromanion_set_playbook
17 de September de 2026 a las 12:34
Añadido
cromanion_decide
17 de September de 2026 a las 12:34
Añadido
cromanion_config
17 de September de 2026 a las 12:34
Añadido
cromanion_pending
17 de September de 2026 a las 12:34
Añadido
cromanion_grants
17 de September de 2026 a las 12:34
Añadido
cromanion_errors
17 de September de 2026 a las 12:34
Añadido
cromanion_upgrade_link
17 de September de 2026 a las 12:34
Añadido
cromanion_install_check
17 de September de 2026 a las 12:34
Añadido
cromanion_site_status
17 de September de 2026 a las 12:34
Añadido
cromanion_verify_claim
17 de September de 2026 a las 12:34
Añadido
cromanion_open_claim
17 de September de 2026 a las 12:34