Skip to main content
Glama

cromanion_surfaces

DestructiveIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
siteIdNoWhich 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.
enabledNoSurfaces the agent may use: inline_hint, card, sticky_bar, bottom_sheet, inline_block, cta_tooltip.
customCssNoCSS applied inside the intervention's shadow root. An empty string clears it.
templatesNoPer-surface HTML, keyed by surface. Use {{message}}, {{cta_label}} and {{cta_url}} as placeholders.
allowModalNoAllow the page-blocking exit modal. Off by default.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okYes
noteNo
changedYes
enabledNoSurfaces now in use.
customCssNoThe CSS as STORED — compare with what you sent to see what the allowlist removed.
templatesNoPer-surface, what was kept and what was stripped from your markup.
allowModalNo

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • addedInput schema / properties / siteId
      Added value: +{
      +  "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.",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "allowModal": {
      +      "type": "boolean"
      +    },
      +    "changed": {
      +      "type": "boolean"
      +    },
      +    "customCss": {
      +      "description": "The CSS as STORED — compare with what you sent to see what the allowlist removed.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "enabled": {
      +      "description": "Surfaces now in use.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "note": {
      +      "type": "string"
      +    },
      +    "ok": {
      +      "type": "boolean"
      +    },
      +    "templates": {
      +      "description": "Per-surface, what was kept and what was stripped from your markup.",
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "ok",
      +    "changed"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint and idempotentHint annotations, it reveals a non-obvious behavior: markup and CSS are re-checked against an allowlist on every visitor, and dangerous content is silently removed. It also advises comparing the response with what was sent — actionable transparency that annotations alone don't convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler: the first states scope, the second discloses the sanitization side effect, and the third states the permission requirement. The most important operational warning is placed right after the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter tool with nested templates and an output schema, the description covers purpose, permission, destructive sanitization, and verification advice. Parameter details and return shape are already handled by the 100% schema coverage and output schema, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful cross-parameter semantics: customCss and templates are subject to allowlist stripping, so their stored/returned values may differ from what was sent. It also frames siteId from the schema's perspective by tying it to the surfaces permission context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description leads with the exact job — choosing where the agent may speak and how those places look — then enumerates the controllable elements: enabled layout surfaces, exit modal, custom CSS, and per-surface HTML. This separates it from sibling configuration tools like cromanion_set_brand or cromanion_set_voice without needing their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear context ('choose where the agent may speak') and a mandatory prerequisite ('Needs the surfaces permission'), but never names alternative tools or says when not to use it. The context is enough to route an agent here, but not as explicit as a when/when-not comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4/5.0
Disambiguation5/5

Each tool maps to a distinct resource or action—state reads (config, pending, grants, site_status), mutations (set_*, add_goal, decide), and lifecycle steps (open_claim, verify_claim, claim_domain) are clearly separated by detailed descriptions. Even similar-sounding tools like install_check vs site_status are explicitly differentiated.

Naming Consistency3/5

All tools share the cromanion_ prefix and snake_case, but the action-object pattern is inconsistent: many are verb_noun (set_mode, verify_claim), while others are bare nouns or verbs (config, pending, crawl, decide, surfaces). This mixed convention is readable but not predictable.

Tool Count3/5

24 tools is at the high end; the server covers a broad domain and each tool has a distinct job, but the set feels heavy with many narrow configuration endpoints (set_brand, set_voice, surfaces, exclusions). It is not bloated enough to be chaotic, but it is borderline.

Completeness4/5

The surface covers the full lifecycle from claim/verify/install through goal definition, rules, decisions, measurement, and lead delivery. Minor gaps exist—no account/site deletion, no broader integration management—but agents can accomplish core workflows without dead ends.

Resources